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

MVVM:是否允许ViewModels相互引用?,mvvm,Mvvm,我不熟悉MVVM模式,不知道如何处理视图模型之间的通信。有一个包含多个单元格视图的表视图。我为表格和每个单元格创建了视图模型: TableView-TableViewModel InputCellView-InputCellViewModel CheckboxCellView-CheckboxCellViewModel 单元格包含用户输入元素,如文本字段、复选框等。每个CellViewModel保存用户在相应单元格中输入的数据。我的问题是,将数据传输到TableViewModel的最佳方式是什

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

TableView-TableViewModel

InputCellView-InputCellViewModel

CheckboxCellView-CheckboxCellViewModel


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

我不会将数据从
CellViewModel
传递到
TableViewModel
,而是直接传递到
Model
)。
表中的更新会触发
表视图模型的更新

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

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

所以

还是最好使用某种事件系统来通知TableViewModel CellViewModel中的更改


是的,那是首选。但是请注意,
CellViewModel
中没有任何更改,有由
CellViewModel
转发的更改。

您可以使用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类出口:PubSubEvent{}
公共类FirstVM{
私有只读IEventagor事件聚合器;
public FirstVM(IEventAggregator事件聚合器)
{
this.eventAggregator=eventAggregator;
this.eventAggregator.GetEvent().Subscribe(s=>{DoWhatYoNeed..});
}   
}

public类SecondVM{private void SendEvent()
{
...
this.eventAggregator.GetEvent().Publish(string.Empty);
}}

如果没有有效负载,您应该在没有有效负载的情况下使用
PubSubEvent
而不是虚拟有效负载,而且我们不知道@ElLunes使用的是prism,还是wpf或c-)
public class SecondVM{  private void SendEvent()
{
    ...
     this.eventAggregator.GetEvent<Exit>().Publish(string.Empty);
}}