我是MVVM模式的新手,不知道如何处理视图模型之间的通信。有一个包含多个单元格视图的表视图。我为表格和每个单元格创建了视图模型:
TableView - TableViewModel
InputCellView - InputCellViewModel
CheckboxCellView - CheckboxCellViewModel
.....
单元格包含用户输入元素,如文本字段,复选框等。每个CellViewModel保存用户在相应单元格中输入的数据。我的问题是,将数据传输到TableViewModel的最佳方法是什么?我目前正在考虑将TableViewModel的引用传递给每个CellViewModel,每当用户更改单元格中的某些数据时,CellViewModel都会将其转发给TableViewModel。这是MVVM模式的有效方法吗?或者是否更好地使用某种事件系统来通知TableViewModel有关CellViewModel中的更改?
答案 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);
}}