2013-12-12 65 views
2

本地化是View还是ViewModel的责任?起初,我认为它显然属于虚拟机,因为它只是需要由视图显示的数据。究竟需要展示什么对于这个观点来说并不重要。另外,我已经获得了XAML比ViewModel代码更脆弱的经验。但在今天的讨论中,有些人坚信本地化是这个观点的责任。MVVM本地化 - 视图与ViewModel中的本地化资源?

下面是一些我看到两个版本的优点:将它们放入视图的

优点:

  • 视图模型是无视本地化
  • 你可以看到在XAML的资源键
  • 更少的代码将它们放入视图的

优势型号:

  • View是无视本地化
  • 的视图并不需要知道,除了它的视图模型
  • 它更容易结合,创建更复杂的字符串什么。

在使用MVVM模式的Wpf应用程序中,应将可本地化的元素(字符串资源)放入视图还是放入viewmodel?为什么?这两种方法还有什么其他的优点和缺点?

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

但是,我主要关注的是为什么从概念或清洁代码的角度来看它更好,无视后端。

+1

这可以被认为主要是基于意见的。在所有情况下,我更喜欢ViewModel-First方法。我在我的应用程序中将字符串保留为常规'resx'资源,并使用一些辅助类将它们加载到VM中,然后将其传递给View。 –

+0

它确实有一个意见组件,但有(我希望)有更多的好的理由来支持或反对每个变体。我对这些感兴趣。 – Wilbert

回答

1

某些资源属于View,某些资源属于ViewModel。我认为在这个问题上没有严格的规定。使用你自己的判断。就我个人而言,我与View共享ViewModel的资源文件。

1

要正确地在您的WPF应用程序中实现本地化,因为它是按照设计的,所以您需要遵循设置的过程,所以没有像您所建议的那样有真正的选择。一件事。您需要在所有UI控件上设置Uid属性,以便在视图模型中显然无法完成。此外,将所有本地化的string值放入单独的dll中是很常见的,因此再次,您无法在视图模型中执行此操作。

我现在没有时间来描述如何去做。相反,有关WPF本地化的完整详细信息,请参阅MSDN上的WPF Globalization and Localization Overview页面。

+2

为什么不能?你可以把所有的字符串作为属性放在viewmodel上,然后虚拟机会在后台查询正确的字符串(从卫星dll的resx中的某个地方)。 – Wilbert

+0

你甚至看过链接页面吗?我只是说,如果你想利用已经内置于WPF的本地化功能,那么你必须遵循他们的规则。然而,如果你想重新发明轮子,那么当然你可以随心所欲地做到这一点......你会得到很多额外的和不必要的代码,但这取决于你。 – Sheridan

+1

我读过它,但它不适用于此:首先,我们需要在后端使用.resx(因为Wpf不是唯一的Gui,Mono不支持Wpf),其次,LocBaml和配置文件提供了不太复杂的环境(CSV),而普通的翻译工具则不太支持。 – Wilbert