Интересно, как ты это делаешь? Предположим, у нас есть приложение MVVM CRUD, которое модифицирует дерево (например, структуру меню). У нас есть модель вида с пунктами меню и два вида: первый с TreeView
, а второй с DataForm
. Основные проблемы:
DataForm
не может справиться
иерархические данные.
- В зависимости от выбранного пункта меню
в
TreeView
DataForm
должен отображать другой набор
поля (например, для пунктов меню
с детьми или без).
Я закончил со следующим. Вид модели имеет 3 поля:
Items
- коллекция
MenuItem
объекты, которые имеют свои
собственная Children
коллекция для
построение иерархического источника данных.
SelectedItem
- в настоящее время выбрано
MenuItem
в TreeView
.
EditedItem
- EditViewModel
объект, который в основном имеет два
потомки: MenuItemEditViewModel
и LeafMenuItemEditViewModel
.
Это свойство устанавливается автоматически
когда SelectedItem
изменяется. это
фактический тип выводится из
SelectedItem.Children
пустота.
TreeView
связан с Items
и SelectedItem
. DataForm
не требуется для поддержания валюты в этом случае (вместо этого текущая позиция установлена TreeView
), а также не отвечает за создание и удаление элементов. Вот почему я решил привязать только ее CurrentItem
для просмотра модели EditedItem
(ItemsSource
не привязан). Его AutoCommit
установлен на False
(когда он True
и ItemsSource
не привязан, все текущие изменения элемента копируются в новый выбранный элемент, когда вы выбираете другой элемент в TreeView
, что не так приятно) , DataForm
поля генерируются автоматически.
Очевидно, что теперь, если мы выберем элемент в TreeView
, затем внесем некоторые изменения в DataForm
и попытаемся выбрать другой элемент в TreeView
, мы получим известную
Невозможно изменить валюту, когда предмет
имеет ошибки проверки или в настоящее время
отредактировано и AutoCommit имеет значение false. Задавать
ItemsSource для ICollectionView для
вместо этого управляйте валютой
В этом случае я хочу, чтобы DataForm
неявно отклонял все изменения. Существует обходной путь для вызова DataForm.CancelEdit()
до изменения TreeView
выбранного элемента (обычно это событие типа PreviewSelectionChanged
или BeforeSelectionChanged
). Но это не MVVM-путь, поскольку TreeView
и DataForm
определены в совершенно разных представлениях (читай: недопустимо).
Есть ли что-то вроде AutoCancel, которая заставляет DataForm
отменять изменения при изменении CurrentItem
? Может кто-нибудь из команды разработчиков может ответить? Или как бы вы справились с такой проблемой?