我想知道你是怎么做这样的事情的。假设,我们有修改树(例如菜单结构)的 MVVM CRUD 应用程序。我们有一个带有菜单项的视图模型和两个视图:第一个带有 a TreeView
,第二个带有 a 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
or的事件BeforeSelectionChanged
)。但这不是 MVVM 方式,因为TreeView
和DataForm
是在完全不同的视图中定义的(阅读:不可接受)。
是否有类似 AutoCancel 的东西DataForm
在更改时强制取消更改CurrentItem
?也许开发团队的人可以回答?或者你会如何处理这样的问题?