Интересно, как вы это делаете. Предположим, у нас есть приложение 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
? Может кто-нибудь из команды разработчиков ответит? Или как бы вы справились с такой проблемой?