Добавить редактирование в MVVM в иерархической структуре данных

Этот вопрос является продолжением этого старого вопроса и является скорее подтверждением, чем открытым вопросом.

Мой экземпляр ViewModel имеет частный экземпляр модели, _modelInst,
ViewModel имеет эксклюзивный доступ к данным модели во время редактирования (поэтому модели не нужно реализовывать INotifyPropertyChanged).

Теперь есть три способа, которыми я придумал, как редактировать данные модели из представления:

  1. Получение / настройка непосредственно в экземпляре модели
    например, для простых полей значений
    return _modelInst.fieldname;
    _modelInst.fieldname = value;
    Это легко реализовать...

  2. Создание экземпляра ViewModel и работа со структурой данных родителя
    например, для более сложных типов объектов, таких как структуры:

    • Создание новой ViewModel для этого типа.
      ViewModel знает родителя и его имя поля.
    • отображая это в ContentControl+DataTemplate
    • получение / настройка:
      через методы родителя с именем поля в качестве параметра,
      перезаписывает весь исходный объект, даже если изменено только одно поле

    Это означает создание нового интерфейса (с процедурами обновления, работающими на _modelInst), реализованный родителем, для каждой из этих структур.

  3. Создание экземпляров ViewModel без непосредственного знания структуры данных родителя
    например, для (списков) классов в родительских классах

    • Создание новой ViewModel для каждого класса

    • Отправка инструкции по обновлению родителю через

      1. команды
      2. Сообщения
      3. отражение (родитель знает, какой ребенок вызвал функцию
        сравнивая экземпляр со всеми сохраненными потомками)

      Все это представляет собой большой беспорядок, создающий функции для каждого поля модели, которое можно редактировать.
      Что означает в значительной степени все поля модели...

(4.) Можно создать общий ViewModel, который работает только через отражение, где каждый подобъект знает своего родителя и свое имя поля (+ индекс, если в списке).
Только логика корня будет мешать модели.
Но это решение также потребует средства для хранения пути к полю в _modelInst,

Есть ли другой (более простой) способ добиться этого?
Я неправильно понял принципы MVVM (снова)?
Подходит ли MVVM для манипулирования большими иерархическими структурами данных?

2 ответа

Надеюсь, эти ресурсы помогут; они немного помогли мне, когда я изучил MVVM и как подходить к представлению графов / иерархий объектов с помощью моделей представлений:

  1. Редактируемый объектный адаптер
  2. Редактируемый коллекционный адаптер
  3. микромоделей

Это отличный вопрос, на который я не думаю, что есть хороший ответ, который идет в комплекте с паттерном MVC.

ViewModels отлично работают, когда модель, к которой они относятся, не имеет дочерних элементов.

Но когда у модели есть дети, как в

Покупатель

        -->Order

        -->Country

(воображая, что Страна была дочерним объектом Заказчика), модель дизайна как бы ломается.

Лучшее, что я нашел, - это использовать наследование и выборочно выставлять только тех детей, для которых вам нужна логика viewmodel. В противном случае просто получите доступ к свойствам модели представления, которое войдет через наследование.

открытый класс CustomerView: Customer // наследуется от Customer (модель) {

public CustomerView(Customer customer)
{
      this.FirstName = customer.FirstName
      //etc..

      //Only if you need it, that is if you have some display-specific
      //logic relating to country for a given view, you create
      //a CountryView class that inherits from Country and gets populated
      //by an instance of it as well
      this.CountryView = new CountryView(customer.Country)
}

public CountryView CountryView {get;set;} //sadly you cannot override Country but you may be able to shadow it.

public string DisplayColor
{
    if(base.FirstName == "Joe")
    {
        return "red";
    }
    return "";
}

}

Это становится грязным, когда имеешь дело с внуками. Если у кого-то есть лучшее решение, я хотел бы услышать это.

Спасибо

Другие вопросы по тегам