WPF/ How can I IValueConverter Update Force

59 Views Asked by At

I write code for multilanguage using IValueConverter. Text will be change dynamically and so many texts has. So I cannot be make using Resource file. I decided to make using IValueConverter. And First time it displayed well. But change language runtime, it will not work I expected. IValueConverter will return a value by current language type. And language type is change in runtime by user.

This is my simplified code:

internal class MessageConverter : IValueConverter, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler? PropertyChanged;

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string? valueOrigin = parameter == null ? ":" : parameter.ToString();
        string[] values = valueOrigin == null ? new string[2] : valueOrigin.Split(':');
        if (values.Length == 0)
        {
            values = new string[] { string.Empty, string.Empty };
        }
        else if (values.Length == 1 && false == values[0].StartsWith("@"))
        {
            values = new string[] { string.Empty, values[0] };
        }

        if ((bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue))
        {
            return values[1];
        }

        MessageHelper.GetInstance().LanguageChanged += MessageConverter_langchanged;

        return MessageHelper.GetMessage(values[0]);
    }

    private void MessageConverter_langchanged(object? sender, EventArgs e)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("")); // ???
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
public class MessageHelper
{
    private static object lockObject = new object();
    private static MessageHelper? instance = null;

    private Dictionary<string, string> ko = new Dictionary<string, string>();
    private Dictionary<string, string> en = new Dictionary<string, string>();
    private Dictionary<string, string> jp = new Dictionary<string, string>();

    private MessageHelper()
    {
        // smaple
        ko.Add("@MSG_0001", "시작");
        en.Add("@MSG_0001", "Start");
    }

    public static MessageHelper GetInstance()
    {
        lock (lockObject)
        {
            if (instance == null)
                instance = new MessageHelper();
            return instance;
        }
    }

    private string language = "KO";

    public static string GetLanguage(string language)
    {
        return language;
    }

    public static void SetLanguage(string language)
    {
        MessageHelper.GetInstance().language = language;
        GetInstance().LanguageChanged?.Invoke(GetInstance(), EventArgs.Empty);
    }

    public event EventHandler? LanguageChanged;

    public static string GetMessage(string messageCode)
    {
        var dic = MessageHelper.GetInstance().language == "en" ? MessageHelper.GetInstance().en : MessageHelper.GetInstance().ko;
        if (dic.ContainsKey(messageCode))
            return dic[messageCode];
        return messageCode;
    }
}
<Button Style="{StaticResource BoldButtonFontStyle}"
        Content="{Binding Converter={StaticResource MessageConverter}, ConverterParameter=@MSG_0001:시작하기, UpdateSourceTrigger=PropertyChanged}" 
        Command="{Binding CommonCommand}" 
        CommandParameter="SaleStart" />

<Button Style="{StaticResource BoldButtonFontStyle}"
    Content="한국어" 
    Command="{Binding CommonCommand}" 
    CommandParameter="Language_Korean" />
<Button Style="{StaticResource BoldButtonFontStyle}"
    Content="English" 
    Command="{Binding CommonCommand}" 
    CommandParameter="Language_English" />
private void CommonCommandProc(string param)
{
    if (param == "Language_Korean")
    {
        MessageHelper.SetLanguage("ko");
    }
    else if (param == "Language_English")
    {
        MessageHelper.SetLanguage("en");
    }
}
1

There are 1 best solutions below

1
Jaeyul Park On

I code using inherit 'MarkupExtension'. It works fine. Thank you every one.