使用MVVM模式访问Model的最佳实践是什么?

时间:2010-02-24 13:52:53

标签: c# design-patterns architecture mvvm

我有一个数据库,它与我的模型(自己的线程)的webservices通信并公开数据对象。我的UI应用程序包含不同的视图和ViewModel以及自定义控件。我正在使用ServiceProvider(IServiceProvider)来访问Model并将事件路由到UI线程。 ViewModel之间的通信由Messenger提供。

这样的方式吗?

我也想知道构建DataObjects的最佳方法是什么

目前我拥有具有层次结构但不支持INotifyProperty的DataObjects,尽管子列表的类型为ObservableCollection。我没有可能在属性上实现notifypropertychange。

我想知道使MVVM友好的最好方法。实现部分类并添加必要的所有属性或命令或包装所有DataObjects并使Model列表和MVVM列表保持同步。

所有的想法和想法都表示赞赏。

2 个答案:

答案 0 :(得分:1)

严格实现MVVM意味着您应该创建ViewModel类,这些类公开将使用View的所有DataObjects(您的Model) - View不能直接访问Model。

在此之后,您将完全控制ViewModel,并且您将能够实现INotifyPropertyChange事件,并在每次更改通知或特定操作时将ViewModel与模型同步。

答案 1 :(得分:1)

我同意贝尔莫的观点,即没有多少人没有严格执行这种模式。可以直接公开Model对象并在这些对象中实现INotifyPropertyChanged。但是下面是你可以用来实现你目前所拥有的基本手段:

class PersonViewModel : INotifyPropertyChanged
{
    Person p = new Person();

    public string First
    {
        get { return p.First; }
        set
        {
            p.First = value;
            onPropertyChanged("First");
        }
    }

    public string Last
    {
        get { return p.Last; }
        set
        {
            p.Last = value;
            onPropertyChanged("Last");
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    private void onPropertyChanged(string propertyName)
    {
        if (PropertyChanged!=null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName);
        }
    }

    #endregion
}

我个人创建了一个继承的ViewModel类,以便我可以将我的INotifyPropertyChanged代码放在那里而不必重复放入。然后我的实现只是从该基类继承。