Должен ли я иметь один класс ViewModel, реализующий INotifyPropertyChanged для каждого класса Model? - PullRequest
0 голосов
/ 08 мая 2019

По сути, у меня есть модель с различными классами, которая загружает мои данные в разные коллекции, включая коллекции коллекций (например, Cart имеет коллекцию Bundle, которая имеет коллекции Product).Если мое понимание MVVM правильное, мне нужно создать один класс ViewModel, который реализует INotifyPropertyChanged (напрямую или через наследование от базового класса) для каждого из моих классов модели.Хотя я должен признать, что мне кажется, что он подразумевает много дублированного кода, просто наличие ViewModel связывает каждое свойство класса модели с вызовом OnPropertyChanged.Например, как показано в этой статье.Я правильно понимаю?

В настоящее время я пытаюсь понять основы MVVM, поэтому я стараюсь полностью реализовать его в своих программах без какой-либо дополнительной инфраструктуры (MVVM Light и других).

1 Ответ

1 голос
/ 08 мая 2019

Вам не нужен ViewModel-Class для каждого имеющегося у вас Model-Class. Ваши классы моделей должны реализовывать интерфейс INotifyPropertyChanged.

Вам нужны ViewModels для взаимодействия с вашими представлениями. В ViewModels вы можете иметь экземпляры ваших Model-Classes.

Кстати: чтобы не писать код для INotifyPropertyChanged каждый раз в каждой ViewModel и Model, я создал абстрактный базовый класс, из которого все получено. Этот класс выглядит так:

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));
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...