在MVVM Light中独立模型更改时更新View的最佳实践

时间:2014-03-19 23:02:21

标签: c# wpf mvvm mvvm-light

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

MVVM light中用于通知ViewModel Model中的数据已发生更改(来自由View或ViewModel触发的事件)的建议方法是什么?应该更新视图吗?

1 个答案:

答案 0 :(得分:1)

我将从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中。