Добавить редактирование в MVVM в иерархической структуре данных
Этот вопрос является продолжением этого старого вопроса и является скорее подтверждением, чем открытым вопросом.
Мой экземпляр ViewModel имеет частный экземпляр модели, _modelInst
,
ViewModel имеет эксклюзивный доступ к данным модели во время редактирования (поэтому модели не нужно реализовывать INotifyPropertyChanged).
Теперь есть три способа, которыми я придумал, как редактировать данные модели из представления:
Получение / настройка непосредственно в экземпляре модели
например, для простых полей значенийreturn _modelInst.fieldname;
_modelInst.fieldname = value;
Это легко реализовать...Создание экземпляра ViewModel и работа со структурой данных родителя
например, для более сложных типов объектов, таких как структуры:- Создание новой ViewModel для этого типа.
ViewModel знает родителя и его имя поля. - отображая это в ContentControl+DataTemplate
- получение / настройка:
через методы родителя с именем поля в качестве параметра,
перезаписывает весь исходный объект, даже если изменено только одно поле
Это означает создание нового интерфейса (с процедурами обновления, работающими на
_modelInst
), реализованный родителем, для каждой из этих структур.- Создание новой ViewModel для этого типа.
Создание экземпляров ViewModel без непосредственного знания структуры данных родителя
например, для (списков) классов в родительских классахСоздание новой ViewModel для каждого класса
Отправка инструкции по обновлению родителю через
- команды
- Сообщения
- отражение (родитель знает, какой ребенок вызвал функцию
сравнивая экземпляр со всеми сохраненными потомками)
Все это представляет собой большой беспорядок, создающий функции для каждого поля модели, которое можно редактировать.
Что означает в значительной степени все поля модели...
(4.) Можно создать общий ViewModel, который работает только через отражение, где каждый подобъект знает своего родителя и свое имя поля (+ индекс, если в списке).
Только логика корня будет мешать модели.
Но это решение также потребует средства для хранения пути к полю в _modelInst
,
Есть ли другой (более простой) способ добиться этого?
Я неправильно понял принципы MVVM (снова)?
Подходит ли MVVM для манипулирования большими иерархическими структурами данных?
2 ответа
Надеюсь, эти ресурсы помогут; они немного помогли мне, когда я изучил MVVM и как подходить к представлению графов / иерархий объектов с помощью моделей представлений:
Это отличный вопрос, на который я не думаю, что есть хороший ответ, который идет в комплекте с паттерном 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 "";
}
}
Это становится грязным, когда имеешь дело с внуками. Если у кого-то есть лучшее решение, я хотел бы услышать это.
Спасибо