2010-09-07 86 views
2

我不知道你是如何做这样的事情的。假设,我们有修改树的MVVM CRUD应用程序(例如,菜单结构)。我们有一个包含菜单项和两个视图的视图模型:第一个为TreeView,第二个为DataForm。主要问题是:当选择更改时,自动取消DataForm中的更改

  1. DataForm无法处理 分层数据。
  2. 根据菜单项中选择的TreeViewDataForm 应(菜单项 与儿童或不例如)显示不同的一组 字段。

我已经结束了以下。视图模型有3个领域:

  1. Items - 有他们自己的 收集Children为 构建分层数据源 MenuItem对象的集合。
  2. SelectedItem - 当前选择 MenuItemTreeView
  3. ​​- EditViewModel 对象基本上具有两个 后代:MenuItemEditViewModelLeafMenuItemEditViewModel。 当SelectedItem被更改时,此属性被自动设置为 。它的 实际类型是从 SelectedItem.Children空虚推断出来的。

TreeView绑定到ItemsSelectedItem。在这种情况下,不需要使用DataForm来维护货币(而不是当前项目由TreeView设置),也不需要负责创建和删除项目。这就是为什么我决定只绑定其CurrentItem查看模型的​​(ItemsSource是未绑定)。其AutoCommit设置为False(当它是TrueItemsSource未绑定时,当您在TreeView中选择不同的项目时,所有当前项目更改将被复制到新选择的项目,这并不好)。 DataForm字段是自动生成的。

显然,现在如果我们选择在TreeView一个项目,然后让在DataForm一些变化,并尝试在TreeView,我们将得到著名

无法更改货币时选择不同的项目一个项目 有验证错误,或正在编辑 ,并且AutoCommit为false。设置 的ItemsSource到ICollectionView到 管理货币,而不是

在这种情况下,我想DataForm隐式地放弃所有更改。有一种解决方法,在之前调用DataForm.CancelEdit()所选项目被更改(通常是类似PreviewSelectionChangedBeforeSelectionChanged的事件)。但它不是MVVM的方式,因为TreeViewDataForm在完全不同的视图中定义(读取:不可接受)。

是否有像AutoCancel这样强制DataForm取消其更改CurrentItem更改?也许有人从开发团队可以回答?或者你会如何处理这样的问题?

+0

错误消息很明显:您需要坚持使用美元。正在编辑项目并且AutoCommit为false时,您无法切换到欧元! :) – Skrymsli 2011-07-27 05:25:59

回答

0

您是否尝试将AutoCommit设置为True?

+0

是的,这不是一个解决方案。我提到它:“当它为True且ItemsSource被解除绑定时,当您在TreeView中选择不同的项目时,所有当前项目更改都会被复制到新选择的项目,这不太好” – 2010-10-22 15:19:12

4

考虑到所有面向业务的RIA功能,我很惊讶地发现Silverlight严重缺乏这种功能。我不接受AutoCommit,因为我希望用户明确地确认挂起的更改,而不是仅仅向数据库提交他们可能不需要的内容。

您可以使用私有成员变量和捕捉数据形(命名不一致的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; 
     } 
    } 
} 
+0

Thanx!但是我已经改变了DataForm源码来满足我的需求。我绝对喜欢你的建议,要求用户确认(在我目前的情况下,如果用户没有明确地保存它们,所有更改都会被取消)。 – 2010-11-30 14:28:45

相关问题