【问题标题】:MVVM: Are ViewModels allowed to reference each other?MVVM:是否允许 ViewModel 相互引用?
【发布时间】:2017-04-11 06:06:54
【问题描述】:

我是 MVVM 模式的新手,不知道如何处理视图模型之间的通信。有一个包含多个单元格视图的表格视图。我为表格和每个单元格创建了视图模型:

TableView - TableViewModel

InputCellView - InputCellViewModel

CheckboxCellView - CheckboxCellViewModel

.....

单元格包含用户输入元素,如文本字段、复选框等。每个 CellViewModel 保存用户在相应单元格中输入的数据。我的问题是,将数据传输到 TableViewModel 的最佳方式是什么?我目前正在考虑将 TableViewModel 的引用传递给每个 CellViewModel,每当用户更改单元格中的某些数据时,CellViewModel 都会将其转发给 TableViewModel。这是 MVVM 模式的有效方法吗?还是使用某种事件系统来通知 TableViewModel 有关 CellViewModel 的更改更好?

【问题讨论】:

    标签: mvvm


    【解决方案1】:

    我不会将数据从CellViewModel 传递给TableViewModel,而是直接传递给Table(-Model)。 Table 中的更新随后会触发 TableViewModel 的更新。

    记住:视图模型准备数据以供视图使用,它们代表视图(阅读:用户)对数据执行更新,但它们不拥有数据.

    表格数据不属于TableViewModel,因此无需向TableViewModel请求更改数据的权限,TableViewModel负责显示正确和当前的数据。

    所以...

    或者使用某种事件系统来通知 TableViewModel CellViewModel 中的更改是否更好?

    是的,这是首选。但请注意,CellViewModel 没有任何更改CellViewModel 转发了 更改...

    【讨论】:

      【解决方案2】:

      您可以使用 prism EventAggregator。 这是一个非常简单的方法。我传递的是空字符串,但你可以传递任何参数

       public class Exit : PubSubEvent<object> {}
       public class FirstVM{
       private readonly IEventAggregator eventAggregator;
      public FirstVM(IEventAggregator eventAggregator)
      {
          this.eventAggregator = eventAggregator; 
       this.eventAggregator.GetEvent<Exit >().Subscribe(s => { DoWhatYoNeed.. });
      }   
      

      }

      public class SecondVM{  private void SendEvent()
      {
          ...
           this.eventAggregator.GetEvent<Exit>().Publish(string.Empty);
      }}
      

      【讨论】:

      • 如果没有有效负载,您应该使用不带有效负载的PubSubEvent 而不是虚拟有效负载,我们不知道@ElLunes 使用的是prism,甚至是wpf 还是c# ;-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 2011-04-12
      相关资源
      最近更新 更多