Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何从ViewModel触发警报?_.net_Design Patterns_Mvvm - Fatal编程技术网

.net 如何从ViewModel触发警报?

.net 如何从ViewModel触发警报?,.net,design-patterns,mvvm,.net,Design Patterns,Mvvm,我问过一些同事这个问题,我相信他们有很好的设计意识。有趣的是,我收到了不同的回应。那么,您认为哪个选项最适合MVVM模式?为什么 假设我需要在$10k以上时显示警报图标 选项1:VM具有属性“Amount”、XAML触发器和/或绑定集元素可见性 选项2:VM具有属性“ShowAlert”,XAML使用bool到可见性转换器绑定可见性 选项3:VM具有属性“AlertVisibility”,XAML直接绑定 备选案文4:其他(请解释) 谢谢你的反馈 在您的情况下,当>10k时,您会显示明确的业

我问过一些同事这个问题,我相信他们有很好的设计意识。有趣的是,我收到了不同的回应。那么,您认为哪个选项最适合MVVM模式?为什么

假设我需要在$10k以上时显示警报图标

  • 选项1:VM具有属性“Amount”、XAML触发器和/或绑定集元素可见性
  • 选项2:VM具有属性“ShowAlert”,XAML使用bool到可见性转换器绑定可见性
  • 选项3:VM具有属性“AlertVisibility”,XAML直接绑定
  • 备选案文4:其他(请解释)

谢谢你的反馈

在您的情况下,当>10k时,您会显示明确的业务规则
,它应该封装在ViewModel而不是View中,因为View知道数据将如何显示,而不是何时和为什么显示

因此,我建议同时公开
Amount
showarter
属性,并避免公开
AlertVisibility
属性,因为它分散了WPF视图特定的内容,如枚举状态(隐藏、折叠等)

如果您希望公开
AlertVisibility
,您将来可能会面临以下问题-想象一下,WPF的新版本摆脱了恼人的枚举,在这种情况下,您必须修改ViewModel以公开新的可见性基础结构/属性,以保持视图正常工作,但从MVVM的角度来看,当视图行为封装在ViewModel中时,这是不正确的。因此,可以直接公开
bool AlertVisible
属性

编辑:关于评论中的命名建议


绝对同意!我建议将
AmountVisible
重命名为
IsAmountSpecified
或类似的名称。

我将通过一个转换器获取视图的警报图标可见性绑定金额值,该转换器的参数为10000。转换器将返回可见或折叠状态


您还可以让虚拟机在超过阈值时发送消息,任何视图或其他关注该消息的视图模型都可以对该消息作出反应。

+1对于n°2,但使用更面向业务的标签,如
amounthasereachedsthreshold
,而不是alert,这与UI更相关,我喜欢选项1和选项2。但我认为选项3揭示了太多的问题implementation@Will:这个标题更好,你的VMI中会有视图逻辑。我不会调用属性ShowAlert,我会将它称为amountVerthreshold。ShowAlert闻起来像视图逻辑。+1是一个很好的答案,但我同意@cadrell0。调用它
showart
听起来太像是在ViewModel中加入了视图特定的逻辑。我更愿意称它为
IsValid
,因为ViewModel不关心用户如何看待无效值,它只知道该值无效。如何显示无效值取决于视图。(如果该值可能由于其他原因而无效,例如数字字段中的文本,而这只是一个特殊的业务规则,那么我可能会使用类似于
IsThresholdeExceed
,或者其他有意义的布尔名称)我认为这取决于这是否是一个业务规则,您将在其他地方使用它,或者这是否是对某个值的视图反应。如果这只是一个反应,那么我会做如下。但是,如果您在其他地方需要它,那么它就属于虚拟机中,正如SLL所建议的那样,命名为Cadrell0Intention非常重要。例如,我有一个应用程序,它显示一个不同的图标来指示集合中是否有项。我认为这属于ValueConverter。我同意@cadrell0的观点,即意图很重要。如果变量警报是一个真实的要求(也是验收标准的一部分),我强烈同意被接受的答案和测试能力论点。然而,如果这仅仅是一个可用性增强,那么就有理由只公开数量。显示警报的UI逻辑或其他有用的东西可以由UX设计器在XAML中控制,而无需更改VM。