我想知道你是怎么做的。假设,我们有MVVM CRUD应用程序,它修改树(例如菜单结构)。我们有一个带有菜单项和两个视图的视图模型:第一个带有TreeView
,第二个带有DataForm
。主要问题是:
DataForm
无法处理
分层数据。TreeView
DataForm
应该显示不同的一组
字段(例如菜单项)
有孩子或没有孩子)。我最终得到了以下内容。 View模型有3个字段:
Items
- 收集
MenuItem
个拥有它们的对象
自己的Children
集合
建立分层数据源。SelectedItem
- 目前已选中
MenuItem
。{/ li>中的TreeView
EditedItem
- EditViewModel
对象基本上有两个
后代:MenuItemEditViewModel
和LeafMenuItemEditViewModel
。
此属性自动设置
SelectedItem
更改时它的
实际类型是从。推断出来的
SelectedItem.Children
空虚。 TreeView
绑定到Items
和SelectedItem
。在这种情况下,DataForm
不需要维护货币(而是由TreeView
设置当前项目),也不负责创建和删除项目。这就是为什么我决定只绑定其CurrentItem
来查看模型的EditedItem
(ItemsSource
是未绑定的)。其AutoCommit
设置为False
(当True
且ItemsSource
未绑定时,当您在{{中选择不同的项目时,所有当前项目更改都会被复制到新选择的项目1}},这不太好看。 TreeView
字段是自动生成的。
显然,现在如果我们在DataForm
中选择一个项目,然后在TreeView
中进行一些更改,并尝试在DataForm
中选择不同的项目,我们就会很好已知
项目时无法更改货币 有验证错误或正在存在 编辑和AutoCommit是错误的。组 ItemsSource到ICollectionView 管理货币
在这种情况下,我希望TreeView
隐式丢弃所有更改。在更改DataForm
所选项目之前,有一种解决方法可以调用DataForm.CancelEdit()
(通常是TreeView
或PreviewSelectionChanged
之类的事件)。但它不是MVVM方式,因为BeforeSelectionChanged
和TreeView
在完全不同的视图中定义(读:不可接受)。
AutoCancel是否会在DataForm
更改时强制DataForm
取消更改?也许开发团队的某些人可以回答?或者您将如何处理此类问题?
答案 0 :(得分:4)
我很惊讶地发现Silverlight严重缺乏此功能,考虑到所有面向业务的RIA功能。我不接受AutoCommit,因为我希望用户明确地确认挂起的更改,而不是仅仅向数据库提交他们可能不需要的内容。
您可以使用私有成员变量可靠地跟踪DataForm的编辑模式,并捕获DataForm的BeginningEdit和EditEnded事件(命名不一致!为什么一个名为xxxEdit,其他名称为Editxxx超出我。如果不是 EditBeginning 和EditEnded ??)。在BeginningEdit的事件处理程序中,将标志设置为true并在EditEnded中将其设置为false。
在SelectionChanged事件中,您可以检查该标志。如果是,则可以在DataForm上调用CancelEdit。
private bool _editing = false;
public MainPage() {
DataForm1.BeinningEdit +=
new EventHandler<CancelEventArgs>(DataForm1_BeginningEdit);
DataForm1.EditEnded +=
new EventHandler<DataFormEditEndedEventArgs>(DataForm1_EditEnded);
}
protected void DataForm1_BeginningEdit(object sender,
System.ComponentModel.CancelEventArgs e) {
_editing = true;
}
protected void DataForm1_EditEnded(object sender,
DataFormEditEndedEventArgs e) {
_editing = false;
}
void TreeView1_SelectedItemChanged(object sender,
RoutedPropertyChangedEventArgs<object> e)
{
if (_editing) {
object previous = DataForm1.SelectedItem;
object current = TreeView1.SelectedItem;
if (MessageBox.Show("Are you sure you want to cancel the changes?",
"Confirm", MessageBoxbutton.OKCancel) == MessageBoxResult.OK) {
DataForm1.CancelEdit();
}
else {
TreeView1.SelectedItem = previous;
}
}
}
答案 1 :(得分:0)
您是否尝试将AutoCommit设置为True?