我正在开发一个实现MVVM light
的应用程序。该应用程序是基于网络的,可以随时接收数据,这将改变Model
中的值。
MVVM light
中用于通知ViewModel Model
中的数据已发生更改(来自未由View或ViewModel触发的事件)的建议方法是什么?应该更新视图吗?
答案 0 :(得分:1)
我将从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
中。