在RaisePropertyChange()上刷新WPF自定义绑定

时间:2018-12-03 22:19:42

标签: .net wpf mvvm binding mvvm-light

我有执行语言本地化的代码。它基于XML方法,该方法首先在应用程序启动期间读取一些XML文件,然后使用当前语言的键/值字符串填充字典。它还会填充一个包含XAML的列表,以描述每种语言标记。

一切正常,我可以显示所有已加载的XAML标志,通过单击标志来更改语言,我的LocalizationManager对象(处理字典)可以为我将任何键转换为本地化字符串。到目前为止很好。

但是...我正在使用MVVM(MVVMLight),当阅读有关本地化和MVVM的内容时,大多数/许多人倾向于认为本地化应由视图处理。在这种情况下,我发现背后的代码打破了MVVM的概念,显然,我确实要避免在VM上为视图上的每个字符串绑定属性,这是我真正想要避免的(顺便说一句,它已经可以正常工作了)。

因此,我尝试了一个自定义的绑定类,称为TranslateBinding。这很简单。

class TranslateBinding : System.Windows.Data.Binding
    {
        public TranslateBinding(string key) : base()
        {
            Converter = new TranslationConverter(key);
        }
    }

这里的技巧是我不将字符串键(绑定路径)转发给基本ctor。我将绑定的Converter设置为自定义的TranslationConverter对象,然后将密钥传递给它。 TranslationConverter类将密钥保留在本地,并且每次绑定更新时,转换器将仅使用该密钥根据当前设置的语言从我的LocalizationManager返回本地化的字符串。

这种方法意味着我可以以非常干净和简短的方式完全从XAML执行本地化/翻译。 XAML代码如下所示,其中“移动”是转换为本地语言的关键。

<Label Content="{loc:TranslateBinding Move}"/> 

这可行,但是我现在唯一的问题是,当我调用RaisePropertyChanged(null)

时,TranslateBinding不会立即刷新。

如果我离开当前视图,然后再次回到同一视图,则该值已更新,以反映新的语言。

所以我的问题很简单,如何强制自定义TranslationBinding也可以在RaisePropertyChanged(null)调用时刷新? 当语言更改后,我希望所有绑定立即刷新以检索新的本地化值。

1 个答案:

答案 0 :(得分:1)

似乎我只需要提出问题才能找到答案。 我只是确保在LocalizationManager上添加一个虚拟字符串属性。 然后,将TranslationBinding的源设置为LocalizationManager,并将其Path设置为虚拟字符串属性。然后,只要更改语言,只要在LocalizationManager中调用RaisePropertyChanged(nameof(DummyString))就足够了。

与对VM的“常规”绑定相比,现在可以完全从XAML进行本地化,而没有键入复杂性的开销。

<Label Content="{loc:TranslateBinding Move}"/>