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