【发布时间】:2010-09-07 09:12:04
【问题描述】:
我想知道你是怎么做到的。假设,我们有修改树(例如菜单结构)的 MVVM CRUD 应用程序。我们有一个带有菜单项和两个视图的视图模型:第一个带有TreeView,第二个带有DataForm。主要问题是:
-
DataForm无法处理 分层数据。 - 取决于所选的菜单项
在
TreeViewDataForm应该显示不同的集合 字段(例如菜单项 有孩子或没有孩子)。
我得到了以下结果。视图模型有 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 隐式丢弃所有更改。在TreeView 所选项目更改之前调用DataForm.CancelEdit() 有一种解决方法(通常是PreviewSelectionChanged 或BeforeSelectionChanged 之类的事件)。但这不是 MVVM 方式,因为 TreeView 和 DataForm 是在完全不同的视图中定义的(读取:是不可接受的)。
当CurrentItem 更改时,是否有类似 AutoCancel 的东西强制DataForm 取消更改?也许开发团队的人可以回答?或者你会如何处理这样的问题?
【问题讨论】:
-
错误信息很明确:你需要坚持使用美元。在编辑项目并且 AutoCommit 为 false 时,您不能切换到欧元! :)
标签: silverlight mvvm currency toolkit dataform