【问题标题】:How should I trigger alerts from the ViewModel?我应该如何从 ViewModel 触发警报?
【发布时间】:2011-12-12 14:00:39
【问题描述】:

我向几位我认为具有良好设计意识的同事提出了这个问题。有趣的是,我收到了不同的回应。那么您认为哪个选项最适合 MVVM 模式,为什么?

假设我需要在 $ 大于 $10k 时显示警报图标。

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

感谢您的反馈!

【问题讨论】:

  • +1 表示 n°2,但带有更多面向业务的标签,例如 AmountHasReachedThreshold,而不是与 UI 相关的 alert
  • 我喜欢选项 1 和选项 2。但我认为选项 3 揭示了太多的实现
  • @Will : 这个标题更好

标签: .net design-patterns mvvm


【解决方案1】:

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

所以我建议同时公开 AmountShowAlert 属性并避免公开 AlertVisibility 属性,因为它会分散此类 WPF 查看特定内容,例如 Visibility 枚举状态(隐藏、折叠、...)

如果您希望公开AlertVisibility,您将来可能会遇到以下问题 - 想象一下,新版本的 WPF 摆脱了烦人的 Visibility 枚举,在这种情况下,您必须修改 ViewModel 以公开新的保持 View 正常工作的可见性基础设施/属性,但是当 View 行为封装在 ViewModel 中时,从 MVVM 的角度来看这是不正确的。所以Keep it Simple 并直接暴露bool AlertVisible 属性。

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

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

【讨论】:

  • 我不会调用属性 ShowAlert,我会称之为 AmountOverThreshold。 ShowAlert 闻起来像视图逻辑。
  • +1 的好答案,但我同意@cadrell0。称它为ShowAlert 听起来太像您将特定于视图的逻辑放入您的视图模型中。我更愿意称它为IsValid,因为 ViewModel 不关心用户如何看到无效值,它只知道该值无效。由视图决定如何显示无效值。 (如果值可能由于其他原因而无效,例如数字字段中的文本,而这只是一个特殊的业务规则,那么我可能会使用 IsThresholdExceeded 之类的东西,或者其他一些有意义的布尔名称)跨度>
  • 我认为这取决于这是一个业务规则,以便您可以在其他地方使用它,或者它是否是对某个值的视图反应。如果这只是一个反应,那么我会做如下。但是,如果您在其他地方需要它,那么它属于 SLL 建议的 VM 并命名为 Cadrell0
  • 意图很重要。例如,我有一个应用程序,它显示一个不同的图标来指示集合是否有项目。我认为这属于 ValueConverter。
  • 我同意@cadrell0 的观点,即意图很重要。如果变量 alert 是一个真正的要求(并且是接受标准的一部分),我强烈同意接受的答案和可测试性论点。但是,如果它仅仅是一个可用性增强,那么有一个论点只是公开金额。显示警报的 UI 逻辑或其他任何有用的东西都可以由 UX 设计人员在 XAML 中控制,而无需更改 VM。
【解决方案2】:

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

您还可以让 VM 在超过阈值时发送消息,并且任何视图或其他愿意监听它的视图模型都可以对消息做出反应。

【讨论】:

  • 否则,您将在 VM 中拥有视图逻辑
猜你喜欢
  • 2015-04-08
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多