MVVM:ViewModels是否允许互相引用?

时间:2016-11-27 12:01:06

标签: mvvm

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

TableView - TableViewModel

InputCellView - InputCellViewModel

CheckboxCellView - CheckboxCellViewModel

.....

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

2 个答案:

答案 0 :(得分:1)

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

请记住:视图模型为要使用的视图准备数据,并且它们代表视图执行数据更新(读取:用户),但它们不拥有数据

表数据不属于TableViewModel,因此没有人需要TableViewModel要求更改数据的权限,TableViewModel负责显示正确的数据和当前的数据。

所以...

  

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

是的,这是首选。但请注意,<{em> CellViewModel中没有任何更改,转发 CellViewModel ...

答案 1 :(得分:0)

您可以使用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);
}}