gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:14:28 24 4
gpt4 key购买 nike

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

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

  • 我结束了以下内容。 View 模型有 3 个字段:
  • Items — 集合MenuItem有它们的对象
    拥有Children收藏为
    构建分层数据源。
  • SelectedItem — 当前选择MenuItemTreeView .
  • EditedItemEditViewModel基本上有两个的对象
    后代:MenuItemEditViewModelLeafMenuItemEditViewModel .
    该属性是自动设置的
    SelectedItem被改变。它的
    实际类型是从SelectedItem.Children空虚。
  • TreeView绑定(bind)到 ItemsSelectedItem . DataForm在这种情况下不需要维护货币(而是由 TreeView 设置当前项目),也不负责创建和删除项目。这就是为什么我决定只绑定(bind)它的 CurrentItem查看模型的 EditedItem ( ItemsSource 未绑定(bind))。其 AutoCommit设置为 False (当它是 TrueItemsSource 未绑定(bind)时,当您在 TreeView 中选择不同的项目时,所有当前项目更改都会复制到新选择的项目,这不太好)。 DataForm字段是自动生成的。

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

    Cannot change currency when an item has validation errors or it is being edited and AutoCommit is false. Set ItemsSource to a ICollectionView to manage currency instead



    在这种情况下,我想要 DataForm隐式丢弃所有更改。有一个解决方法可以调用 DataForm.CancelEdit()之前 TreeView选定的项目被更改(通常是像 PreviewSelectionChangedBeforeSelectionChanged 这样的事件)。但它不是 MVVM 方式,因为 TreeViewDataForm在完全不同的 View 中定义(阅读: Not Acceptable )。

    是否有类似 AutoCancel 的东西强制 DataForm取消更改时其 CurrentItem改变了吗?也许开发团队的人可以回答?或者你会如何处理这样的问题?

    最佳答案

    考虑到所有面向业务的 RIA 功能,我惊讶地发现 Silverlight 严重缺乏此功能。 AutoCommit 对我来说是 Not Acceptable ,因为我希望用户明确地确认挂起的更改,而不是仅仅向数据库提交他们可能不想要的东西。

    您可以使用私有(private)成员变量可靠地跟踪 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;
    }
    }
    }

    关于silverlight - 更改选择时自动取消 DataForm 中的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3657300/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com