【发布时间】:2019-05-05 06:46:45
【问题描述】:
我有执行语言本地化的代码。它基于一种 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) 调用时也刷新?
当语言发生变化时,我希望所有绑定立即刷新以检索新的本地化值。
【问题讨论】:
-
您的
TranslateBinding没有绑定到任何绑定源(您只需调用base()),因此没有发生更新。尝试设置TranslateBinding构造函数的源(和路径)。尝试以下操作: 使用具有现有属性的现有源对象,这会触发属性更改通知。属性的实际类型和内容根本不重要(因为 TranslationConverter 将忽略来自绑定源的内容)。 (1/2) -
(2/2) 用作绑定源的对象应该是所有 TranslateBinding 实例使用的 单个 实例。每当语言发生变化时,让该对象触发属性更改通知,这将反过来触发 TranslateBinding 并让 TranslationConverter 发挥它的魔力...
-
谢谢@elgonzo 我同时也想通了。它就像一个魅力。我一直在寻找一种简单、压缩的解决方案来从纯 XAML 进行本地化。这似乎满足了我的所有要求,XAML 变得非常好、简单、干净。
-
我已经看到(并且赞成):-)
标签: .net wpf mvvm binding mvvm-light