注意MVVM纯粹主义者:ViewModel应该访问本地化资源吗?

Mar*_*ark 11 wpf localization mvvm

我有时难以理解ViewModel的目的,特别是关于它应该和不应该做什么.

所以......我发现自己想要从我的ViewModel中公开一个显示字符串.好吧,实际上它是一个日期字符串,如果没有设置日期,我想显示"未知"之类的内容.我真的想要一个解决方案来涵盖一般情况,所以我不想讨论使用null和fallback值.它同样可以是"等待调度"或"启动中止"等状态消息.

问题是,ViewModel应该如何向View公开显示字符串.应用程序需要本地化,因此我们不能在ViewModel中使用硬编码字符串.

可以从ViewModel访问应用程序的资源,并返回显示字符串吗?

另外,我应该使用resx字符串资源还是Xaml资源字典?我倾向于Xaml.优点缺点?

谢谢,马克

Mar*_*ris 9

您正在做的是获取系统内部的数据并将其转换为一种格式,使其对用户更有用和清晰.这是观点的责任.视图的责任是将有效日期格式化为正确的文化,并且对您希望显示的任何文本负有相同的责任.

在同样的方面,您提供的状态示例可能会作为枚举存储在视图模型中(因为这样可以更容易地将业务逻辑应用于它们,这是视图模型的角色)并且它将是视图的责任以在各方面为用户工作的方式显示值.这包括大小,颜色,字体,位置文化.

尽管如此,我知道将显示逻辑放在我的viewmodel中(例如连接firstname和surname)只是因为它更容易.我甚至已经知道使用代码隐藏(震惊,恐怖!),它适合我的目的.纯洁与实用之间存在着滑动的尺度,你坐在那条线上取决于你.

  • 你使用......*CODE BEHIND*?这种堕落的活动在StackOverflow上没有位置(哦,和+1;) (2认同)

Eso*_*ame 9

正如其他答案中所提到的,这显然是观点的责任.视图模型应公开要检查的视图的数据属性(状态枚举或类似内容),以便确定显示消息的详细信息.从纯粹主义者的角度来看,从VM或后面的代码生成显示属性是正确的.

不过,我很惊讶听不到数据操纵者的建议.在TextBlock中使用它们绑定到公开的状态枚举值并相应地更新文本.此问题将其性能与转换器绑定进行比较,并建议触发器在此方案中的性能更佳.我自己没有做过任何测试,所以我不确定,但对我来说这似乎是直觉上合理的,前提是你没有听取过多的不同枚举值.在这种情况下,我也认为这是更合适的方法,我会引用这个问题,要求对VC和DT用例进行比较,尽管我不认为这是非常有争议的.换句话说,如果一个人认为VM是类固醇的价值转换器(这是我非常怀疑并且目前不同意或不同意的声明),那么这个论点认为:VM不应该暴露显示属性; VM的目的和能力是VC的超级集合; 因此,VC不应该暴露显示属性.

我正在尽力给出纯粹主义者的答案(或者我认为至少是这样),但是编写代码肯定比编写大量数据触发器更容易,特别是如果你有许多不同的值要解决.

关于资源问题,请查看有关资源文件的MSDN文章,这在某些方面比resx文件更容易使用.您应该使用哪种方法取决于您的使用案例.