【问题标题】:How to make view model and model communicate?如何让视图模型和模型通信?
【发布时间】:2011-11-15 07:50:07
【问题描述】:

我正在为我的应用程序使用 MVVM 模式。该模型实际上并行运行一组测试,并保留测试状态(包括其结果)的标签。我希望在视图中显示状态和结果。我一直在设计视图模型。

问题是模型中有很多类和子类层次结构,所有需要在视图中显示的数据都存储在其中。这些数据是动态的。 我现在不确定如何设计视图模型。

我一直在考虑这些思路 - 在视图模型中创建一个新的数据结构,它反映要在视图中显示的内容,并获取所有视图模型将挖掘模型以获取所需的数据。在这种情况下,我很困惑模型将如何在数据更改时更新视图模型。或者考虑到数据存储在不同的类和子类中,模型和视图模型如何相互通信。

【问题讨论】:

  • 您的模型可以在更改状态时触发事件吗?理想情况下,模型是愚蠢的,并且被其他东西操纵。他们不应该自我变异。
  • 实际上,我一次可以运行多个测试 - 因此基本上一次可以运行多个模型,用户可以选择查看哪些数据。我可以让模型在它发生变化时触发。如果模型被认为是愚蠢的 - 我的设计有问题吗?运行测试的逻辑是否应该驻留在 VM 中?
  • 每个模型都需要有一个与之对应的视图模型来处理事件并触发其自己的通知属性发生变化,然后您就可以拥有一个可以包含这些子视图模型的父视图模型。

标签: wpf mvvm


【解决方案1】:

您的视图模型应该包含所有需要在视图上显示数据的模型的引用。然后视图模型应该处理来自模型类的事件并触发 NotifyPropertyChanged 事件。

如果您的视图很复杂,需要很多模型,那么您可以考虑将视图拆分为多个视图和相应的视图模型。

【讨论】:

  • 我有不同的数据可以在不同的时间改变。我认为很难为每个人订阅事件。 VM 和 Model 是否可以通过其他方式进行通信?
  • 您可以从模型类中触发 NotifyPropertyChanged 事件。然后在视图模型中处理这些事件并再次从视图模型中触发 NotifyPropertyChanged。您的视图模型必须知道模型何时发生更改。其他方法是定期检查视图模型中模型类的属性,然后检查哪些属性已更改并为这些属性触发 NotifyPropertyChanged 事件。
【解决方案2】:

您说用户选择查看哪些数据,所以我想您的 VM 可以保存一组模型和一个指示哪个是“活动”模型的索引,并且只与那个进行通信。

对于该通信,解决方案可能是向模型传递一个 Action,以便在新数据可用时调用,该 Action 将触发 VM 中的 NotifyPropertyChanged。如果您确保只有“活动”模型具有该操作,而在其他模型中它为 null 意味着“不触发更新”,这将特别有效。

【讨论】:

    猜你喜欢
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2011-09-06
    • 1970-01-01
    相关资源
    最近更新 更多