【问题标题】:What is the best practice for accessing Model using MVVM pattern使用 MVVM 模式访问模型的最佳实践是什么
【发布时间】:2011-01-20 13:12:35
【问题描述】:

我有一个数据库,它通过我的模型(自己的线程)与 web 服务进行通信并公开数据对象。我的 UI 应用程序由不同的视图和视图模型以及自定义控件组成。我正在使用 ServiceProvider (IServiceProvider) 来访问模型并将事件路由到 UI 线程。 ViewModel 之间的通信由 Messenger 处理。

这是要走的路吗?

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

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

我想知道使它们对 MVVM 友好的最佳方法。实现部分类并添加所有必要的属性或命令或包装所有数据对象并使模型列表和 MVVM 列表保持同步。

感谢所有想法和想法。

【问题讨论】:

    标签: c# design-patterns architecture mvvm


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我同意 Bermo 的观点,即没有多少人不严格执行该模式。可以直接公开模型对象并在这些对象中实现 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 代码放在那里而不必重复放入。然后我的实现只是从该基类继承。

      【讨论】:

      • 如果一些外部代码改变了模型,如何保持视图模型同步?
      猜你喜欢
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      相关资源
      最近更新 更多