当模型在MVVM光中独立变化时更新视图的最佳实践

本文关键字:新视图 更新 最佳 变化 模型 MVVM 独立 | 更新日期: 2023-09-27 17:51:05

我正在研究一个实现MVVM light的应用程序。该应用程序是基于网络的,可以在任何时候接收数据,这些数据将改变Model中的值。

MVVM light中建议的方法是什么,用于通知ViewModels中Model中的数据已经更改(从由视图或ViewModel触发的不是的事件)并且视图应该更新?

当模型在MVVM光中独立变化时更新视图的最佳实践

我将从MVVM Light中抽象出来,并尝试展示一个适合MVVM风格的通用解决方案。


Notifying ViewModels that data in the Model has changed

ModelViewModel中的属性必须实现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

如果这个事件没有发生在ViewViewModel中,那么如何以MVVM的方式与他合作?在本模型中,此事件完全不应该被触发,因为它只应该是属性和INotifyPropertyChanged接口的最大实现。

无论如何,我建议你在ViewModel中处理这个事件-对他来说这是一个好地方。您不应该认为这些数据将通过网络或用户更新,尽量找到不依赖于实现的最抽象的解决方案。您可以创建一个带有接口的类助手,它将与网络一起工作,并在ViewModel的一侧调用它,例如在Command中。