我想知道你是怎么做到的。假设我们有MVVM CRUD应用程序,它可以修改树(例如,菜单结构)。我们有一个带有菜单项的 View 模型和两个 View :第一个带有TreeView
,第二个带有DataForm
。主要问题是:
DataForm
无法处理分层数据。
在
TreeView
中应该显示不同的
字段(例如菜单项)
有 child 或没有 child )。
我结束了以下内容。 View 模型具有3个字段:
DataForm
—的集合带有它们的
Items
对象自己的
MenuItem
集合建立分层数据源。
Children
—当前选择SelectedItem
中的MenuItem
。 TreeView
— EditedItem
基本上有两个的对象后代:
EditViewModel
和MenuItemEditViewModel
。此属性是自动设置的
更改
LeafMenuItemEditViewModel
时。它的实际类型是根据
SelectedItem
空虚。 SelectedItem.Children
绑定(bind)到TreeView
和Items
。在这种情况下,不需要SelectedItem
维护货币(相反,当前项目由DataForm
设置),它也不负责创建和删除项目。这就是为什么我决定仅绑定(bind)其TreeView
来查看模型的CurrentItem
(EditedItem
未绑定(bind))的原因。它的ItemsSource
设置为AutoCommit
(当它是False
且未绑定(bind)True
时,当您在ItemsSource
中选择其他项目时,所有当前项目更改都会复制到新选择的项目中,这不太好)。 TreeView
字段是自动生成的。显然,现在,如果我们在
DataForm
中选择一个项目,然后对TreeView
进行一些更改,然后尝试在DataForm
中选择其他项目,我们将众所周知在这种情况下,我希望
TreeView
隐式丢弃所有更改。有一种解决方法,可以在更改DataForm
所选项目之前调用DataForm.CancelEdit()
(通常是类似TreeView
或PreviewSelectionChanged
的事件)。但这不是MVVM方式,因为BeforeSelectionChanged
和TreeView
是在完全不同的 View 中定义的(阅读: Not Acceptable )。是否有类似AutoCancel之类的东西,当
DataForm
更改时,它会强制DataForm
取消更改?也许开发团队的人可以回答?或者您将如何处理此类问题? 最佳答案
考虑到所有面向业务的RIA功能,我惊讶地发现Silverlight严重缺乏此功能。 AutoCommit对我来说是 Not Acceptable ,因为我希望用户明确地确认未决的更改,而不是仅仅将某些不需要的内容提交给数据库。
您可以使用私有(private)成员变量并捕获DataForm的BeginningEdit和EditEnded事件来可靠地跟踪DataForm的编辑模式(命名不一致!为什么一个叫xxxEdit而另一个叫Editxxx不在我范围内。应该不是EditBeginning和EditEnded ??)。在BeginningEdit的事件处理程序内,将标志设置为true,然后在EditEnded中将其设置为false。
然后,在SelectionChanged事件中,可以检查该标志。如果为true,则可以在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;
}
}
}
关于silverlight - 选择更改后,自动取消DataForm中的更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3657300/