Pio*_*trK 2 c# wpf localization mvvm mvvm-light
在 MVVM Light WPF 应用程序中实现运行时本地化更改功能的正确方法是什么?我正在使用基于资源的本地化(.resx 文件),我希望几乎可以随时更改语言环境。
我虽然在第一次约在做全局属性App.xaml.cs与LocalizationChanged每个查看有线了事件,但这种违反MVVM至少两个规则:没有在后台代码和耦合View类在一起,因为他们会在App类中依赖(这将更难对它们进行单元测试)
另一个想法是创建ILocalizableModel将由LocalizableModel类实现的全局接口(在运行时通过 mvvm light magic 注入),然后提供接口来注册LocalizationChanged事件和设置新本地化的方式(可能还有一些其他功能,例如枚举可用的本地化)。该事件将在 ViewModel 类中触发并请求它们更新所有属性。这还有另一个问题:某些视图数据(如列表)必须重新创建才能更新。在 ViewModel 中处理强特定于视图的代码似乎也有点扭曲。
另一个想法是在模型中使用观察者模式或自动属性。
但是什么是“正确”的 MVVM 方法呢?
我花了数周时间对此进行研究,得出的结论是 resx 文件不是 WPF/MVVM 的最佳解决方案。我发现的最佳解决方案是使用自定义标记扩展,它允许您像这样声明 XAML:
<TextBlock Text="{Translate 'Hello World!'}" />
Run Code Online (Sandbox Code Playgroud)
这提供了许多好处:
| 归档时间: |
|
| 查看次数: |
764 次 |
| 最近记录: |