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

  • DataForm无法处理
    分层数据。
  • 取决于所选的菜单项
    TreeView
    应该显示不同的
    字段(例如菜单项)
    有 child 或没有 child )。

  • 我结束了以下内容。 View 模型具有3个字段:
  • DataForm —的集合
    带有它们的Items对象
    自己的MenuItem集合
    建立分层数据源。
  • Children —当前选择SelectedItem中的MenuItem
  • TreeViewEditedItem基本上有两个的对象
    后代:EditViewModelMenuItemEditViewModel
    此属性是自动设置的
    更改LeafMenuItemEditViewModel时。它的
    实际类型是根据SelectedItem空虚。
  • SelectedItem.Children绑定(bind)到TreeViewItems。在这种情况下,不需要SelectedItem维护货币(相反,当前项目由DataForm设置),它也不负责创建和删除项目。这就是为什么我决定仅绑定(bind)其TreeView来查看模型的CurrentItem(EditedItem未绑定(bind))的原因。它的ItemsSource设置为AutoCommit(当它是False且未绑定(bind)True时,当您在ItemsSource中选择其他项目时,所有当前项目更改都会复制到新选择的项目中,这不太好)。 TreeView字段是自动生成的。

    显然,现在,如果我们在DataForm中选择一个项目,然后对TreeView进行一些更改,然后尝试在DataForm中选择其他项目,我们将众所周知



    在这种情况下,我希望TreeView隐式丢弃所有更改。有一种解决方法,可以在更改DataForm所选项目之前调用DataForm.CancelEdit()(通常是类似TreeViewPreviewSelectionChanged的事件)。但这不是MVVM方式,因为BeforeSelectionChangedTreeView是在完全不同的 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/

    10-13 03:12