Wpf MVVM本地化-视图中的本地化资源与ViewModel中的本地化资源?

Wpf MVVM本地化-视图中的本地化资源与ViewModel中的本地化资源?,wpf,mvvm,localization,Wpf,Mvvm,Localization,本地化是视图的责任还是视图模型的责任?起初,我认为它显然属于VM,因为它只是需要由视图显示的数据。确切需要显示的内容对视图并不重要。此外,我还体验到XAML比ViewModel代码更脆弱。但在今天的一次讨论中,一些人坚信本地化是观点的责任 以下是我看到的两个版本的一些优点: 将它们放到视图中的优点: ViewModel忽略了本地化 您可以在XAML中看到资源密钥 更少的代码 将它们放入ViewModel的优点: 视图忽略了本地化 视图不需要知道任何东西,除了它的ViewModel 合并和创

本地化是视图的责任还是视图模型的责任?起初,我认为它显然属于VM,因为它只是需要由视图显示的数据。确切需要显示的内容对视图并不重要。此外,我还体验到XAML比ViewModel代码更脆弱。但在今天的一次讨论中,一些人坚信本地化是观点的责任

以下是我看到的两个版本的一些优点:

将它们放到视图中的优点:

  • ViewModel忽略了本地化
  • 您可以在XAML中看到资源密钥
  • 更少的代码
将它们放入ViewModel的优点:

  • 视图忽略了本地化
  • 视图不需要知道任何东西,除了它的ViewModel
  • 合并和创建更复杂的字符串更容易
在使用MVVM模式的Wpf应用程序中,可本地化元素(字符串资源)应该进入视图还是进入viewmodel?为什么?这两种方法还有哪些优点和缺点

评论后的一些背景信息:假设本地化后端基于resx(而不是LocBaml)。此外,假设有一个框架(视图变量)可以透明地用字符串替换视图中的资源ID,或者(视图模型变量)可以为视图模型上的本地化属性自动生成INotifyPropertyChanged事件


然而,我主要感兴趣的是,为什么从概念或更清晰的代码角度来看它更好,而不考虑后端。

要在设计的WPF应用程序中正确实现本地化,您需要遵循set过程,因此没有像您建议的那样真正的选择。一方面您需要在所有UI控件上设置
Uid
属性,这样显然无法在视图模型中完成。此外,将所有本地化的
string
值放在单独的DLL中是很常见的,所以在视图模型中也不能这样做


我现在没有时间确切描述怎么做。相反,有关WPF中本地化的完整详细信息,请参见MSDN上的页面。

一些资源属于视图,而一些资源属于ViewModel。我认为在这件事上没有严格的规定。运用你自己的判断。就我个人而言,我正在与视图共享ViewModel的资源文件。

这主要是基于观点的。在所有情况下,我都喜欢ViewModel优先的方法。在我的应用程序中,我将字符串保留为基于常规
resx
的资源,并使用几个助手类将其加载到VM中,然后将其传递给视图。当然,它确实有一个意见组件,但(我希望)支持或反对每个变体的理由更多。我对这些感兴趣。为什么不呢?您可以将所有字符串作为属性放在viewmodel上,VM将在后端查询正确的字符串(从卫星dll中的resx中的某个位置)。您是否查看了链接页面?我想说的是,如果您想利用WPF中已经内置的本地化功能,那么您必须遵循它们的规则。然而,如果你想重新发明轮子,那么你当然可以随心所欲地去做。。。你最终会得到很多额外和不必要的代码,但这取决于你。我确实读过,但它不适用于此:首先,我们需要在后端使用.resx(因为Wpf不是唯一的Gui,Mono不支持Wpf),其次,LocBaml和consorts提供了一个不太复杂的环境(CSV)通用翻译工具支持较少。