【问题标题】:Should I have one ViewModel class implementing INotifyPropertyChanged for each Model class?我应该有一个 ViewModel 类为每个 Model 类实现 INotifyPropertyChanged 吗?
【发布时间】:2019-09-25 14:36:01
【问题描述】:

基本上,我有一个包含各种类的模型,这些类将我的数据加载到不同的集合中,包括集合的集合(例如,Cart 有一个Bundle 的集合,它有一个Product 的集合)。如果我对 MVVM 的理解是正确的,我需要为我的每个模型类创建一个实现 INotifyPropertyChanged(直接或通过从基类继承)的 ViewModel 类。尽管我必须承认,在我看来,这意味着很多重复的代码,只是让 ViewModel 将模型类的每个属性与 OnPropertyChanged 调用相关联。 就像this 文章中显示的那样。 我说对了吗?

我目前正在尝试了解 MVVM 的基础知识,因此我尝试在我的程序中完全实现它,而无需任何额外的框架(MVVM Light 等)。

【问题讨论】:

    标签: c# mvvm


    【解决方案1】:

    您不需要为您拥有的每个模型类创建一个视图模型类。你的模型类应该实现INotifyPropertyChanged-Interface。

    您需要 ViewModel 与您的视图交互。在 ViewModels 中,您可以拥有模型类的实例。

    顺便说一句:为了避免每次在每个 ViewModel 和 Model 中都为 INotifyPropertyChanged 编写代码,我创建了一个抽象基类,所有内容都来自该基类。这个类看起来像:

    public abstract class NotifyBase : INotifyPropertyChanged
    {
      private readonly Dictionary<string, object> mapping;
    
      protected NotifyBase()
      {
        mapping = new Dictionary<string, object>();
      }
    
      protected void Set<T>(T value, [CallerMemberName] string propertyName = "")
      {
        mapping[propertyName] = value;
        OnPropertyChanged(propertyName);
      }
    
      protected T Get<T>([CallerMemberName] string propertyName = "")
      {
        if(mapping.ContainsKey(propertyName))
          return (T)mapping[propertyName];
        return default(T);
      }
    
      public event PropertyChangedEventHandler PropertyChanged;
    
      protected virtual void OnPropertyChanged([CallerMemeberName] string propertyName = null)
      {
        PropertyChangedEventHandler handler = PropertyChanged;
        if(handler != null)
        {
          handler(this, new PropertyChangedEventArgs(propertyName));
        }
      }
    }
    

    【讨论】:

    • 谢谢,我会凭直觉这样做,但这不是 msdn 推荐的。
    猜你喜欢
    • 2010-10-20
    • 2017-03-09
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    相关资源
    最近更新 更多