当模型在MVVM光中独立变化时更新视图的最佳实践
本文关键字:新视图 更新 最佳 变化 模型 MVVM 独立 | 更新日期: 2023-09-27 17:51:05
我正在研究一个实现MVVM light
的应用程序。该应用程序是基于网络的,可以在任何时候接收数据,这些数据将改变Model
中的值。
MVVM light
中建议的方法是什么,用于通知ViewModels中Model
中的数据已经更改(从由视图或ViewModel触发的不是的事件)并且视图应该更新?
我将从MVVM Light
中抽象出来,并尝试展示一个适合MVVM风格的通用解决方案。
Notifying ViewModels that data in the Model has changed
在Model
或ViewModel
中的属性必须实现INotifyPropertyChanged
接口。他有一个事件PropertyChangedEventHandler(propertyName)
通知通知属性:
public class NotificationObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
假设,我们有这个接口实现了一个Model
:
public class MyModel : NotificationObject
{
private string _text = "";
public string Text
{
get
{
return _text;
}
set
{
_text = value;
NotifyPropertyChanged("Text");
}
}
}
然后,要知道这个属性何时被更改,在构造函数中为ViewModel
创建一个事件处理程序:
public MyViewModel()
{
MyModel = new MyModel();
MyModel.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(MyModel_PropertyChanged);
}
private void MyModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName.Equals("Text"))
{
System.Diagnostics.Debug.WriteLine("Text changed");
}
}
From an event which was not triggered by the View or ViewModel
如果这个事件没有发生在View
或ViewModel
中,那么如何以MVVM的方式与他合作?在本模型中,此事件完全不应该被触发,因为它只应该是属性和INotifyPropertyChanged
接口的最大实现。
无论如何,我建议你在ViewModel
中处理这个事件-对他来说这是一个好地方。您不应该认为这些数据将通过网络或用户更新,尽量找到不依赖于实现的最抽象的解决方案。您可以创建一个带有接口的类助手,它将与网络一起工作,并在ViewModel
的一侧调用它,例如在Command
中。