选择更改时,自动取消DataForm中的更改

时间:2010-09-07 09:12:05

标签: silverlight mvvm currency toolkit dataform

我想知道你是怎么做的。假设,我们有MVVM CRUD应用程序,它修改树(例如菜单结构)。我们有一个带有菜单项和两个视图的视图模型:第一个带有TreeView,第二个带有DataForm。主要问题是:

  1. DataForm无法处理 分层数据。
  2. 取决于所选的菜单项 在TreeView DataForm 应该显示不同的一组 字段(例如菜单项) 有孩子或没有孩子)。
  3. 我最终得到了以下内容。 View模型有3个字段:

    1. Items - 收集 MenuItem个拥有它们的对象 自己的Children集合 建立分层数据源。
    2. SelectedItem - 目前已选中 MenuItem。{/ li>中的TreeView
    3. EditedItem - EditViewModel 对象基本上有两个 后代:MenuItemEditViewModelLeafMenuItemEditViewModel。 此属性自动设置 SelectedItem更改时它的 实际类型是从。推断出来的 SelectedItem.Children空虚。
    4. TreeView绑定到ItemsSelectedItem。在这种情况下,DataForm不需要维护货币(而是由TreeView设置当前项目),也不负责创建和删除项目。这就是为什么我决定只绑定其CurrentItem来查看模型的EditedItemItemsSource是未绑定的)。其AutoCommit设置为False(当TrueItemsSource未绑定时,当您在{{中选择不同的项目时,所有当前项目更改都会被复制到新选择的项目1}},这不太好看。 TreeView字段是自动生成的。

      显然,现在如果我们在DataForm中选择一个项目,然后在TreeView中进行一些更改,并尝试在DataForm中选择不同的项目,我们就会很好已知

        

      项目时无法更改货币   有验证错误或正在存在   编辑和AutoCommit是错误的。组   ItemsSource到ICollectionView   管理货币

      在这种情况下,我希望TreeView隐式丢弃所有更改。在更改DataForm所选项目之前,有一种解决方法可以调用DataForm.CancelEdit()(通常是TreeViewPreviewSelectionChanged之类的事件)。但它不是MVVM方式,因为BeforeSelectionChangedTreeView在完全不同的视图中定义(读:不可接受)。

      AutoCancel是否会在DataForm更改时强制DataForm取消更改?也许开发团队的某些人可以回答?或者您将如何处理此类问题?

2 个答案:

答案 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?