Добавить редактирование в MVVM в иерархической структуре данных - PullRequest
5 голосов
/ 29 июля 2010

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 16 июля 2011

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

  1. Адаптер редактируемого объекта
  2. Редактируемый адаптер коллекции
  3. микромоделей
0 голосов
/ 05 октября 2015

Это отличный вопрос, для которого я не думаю, что есть хороший ответ, который идет в комплекте с паттерном 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 "";
}

}

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

Спасибо

...