我应该为每个Model类提供一个实现InotifyPropertyChanged的ViewModel类吗?

时间:2019-05-07 21:53:05

标签: c# mvvm

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

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

1 个答案:

答案 0 :(得分:1)

对于每个模型类,您都不需要ViewModel-Class。您的模型类应该实现INotifyPropertyChanged-接口。

您需要ViewModels与您的视图进行交互。在ViewModel中,您可以拥有Model-Class的实例。

顺便说一句:为了避免每次在每个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));
    }
  }
}