在MVVM Light应用程序中实现运行时本地化更改的正确方法是什么?我使用的是基于资源的本地化(.resx文件),我希望几乎在任何时候都可以更改地区。
我最初认为在App.xaml.cs中使用每个视图中连接的LocalizationChanged事件来执行全局属性,但这至少违反了MVVM的两条规则:代码隐藏类和耦合视图类中不包含代码,因为它们将依赖于App (将更难对它们进行单元测试)
另一个想法是创建全局接口ILocalizableModel,它将由LocalizableModel类(通过mvvm魔术在运行时注入)实现,然后提供注册LocalizationChanged事件的接口和设置新本地化的方法(以及其他一些功能,比如枚举可用的本地化)。该事件将在ViewModel类中触发,并请求它们更新所有属性。这还有另一个问题:如果不重新创建某些视图数据(如列表),则无法更新它们。在ViewModel中处理特定于视图的强代码似乎也有点扭曲。
另一个想法是使用在模型中连接的观察者模式或自动属性。
但是,什么是“正确”,MVVM的方式来这样做呢?
发布于 2016-04-13 13:30:19
我花了很多周的时间研究这个问题,并得出了这样的结论:对于WPF/MVVM来说,resx文件不是最好的解决方案。我发现的最佳解决方案是使用自定义标记扩展,它允许您像这样声明XAML:
<TextBlock Text="{Translate 'Hello World!'}" />这提供了一些好处:
https://stackoverflow.com/questions/36595646
复制相似问题