【问题标题】:Silverlight DataForm, MVVM, IEditable object and custom EditTemplate. How to go about custom dirty state checkingSilverlight DataForm、MVVM、IEditable 对象和自定义 EditTemplate。如何进行自定义脏状态检查
【发布时间】:2011-08-27 14:04:02
【问题描述】:

我对 Silverlight DataForm 和子集合有一个有趣的问题。我也有一个可行的解决方案,但感觉就像一个 hack(它一个 hack),我想知道是否有人有更优雅的解决方案。

我有一个绑定到 GroupViewModel 集合的 DataForm。每个 GroupViewModel 都有一个 UserViewModel 的 ObservableCollection,我希望用户能够在显示 DataForm 的 EditTemplate 时添加和删除它。

用于执行此操作的 UI 是一个简单的 ComboBox,其中包含所有用户的列表和当前在组中的用户的列表框。有一个添加和删除按钮可以将用户从一个列表移动到另一个列表。

现在,...DataForm 绑定到的视图模型实现了 IEditableObject,..这很酷,因为如果取消编辑,我会得到回滚行为,但在这种情况下还不够。我需要一种方法来告诉 DataForm 我的 VM 是否处于脏状态。

由于我的 ViewModel 有一个 SelectedUserToAdd 属性,所有用户 ComboBox 的 SelectedItem 都绑定到该属性,因此当用户选择要添加的用户时,PropertyChanged 事件会在我的 VM 上触发,并且 DataForm 认为某些内容已更改并且提交 ( OK) 按钮亮起。 当 ListBox 中的选择因 SelectedUserToRemove 属性而改变时,它也会亮起。

显然,如果 ListBox 中的 UserViewModels 已更改,我想要的是让提交按钮亮起。

解决方案很简单。如果我从 SelectedUserToAdd 和 SelectedUserToRemove 属性中删除更改通知,我可以停止提交按钮亮起,并且我可以获得 提交按钮通过使用名为 'Dirty' 的虚拟属性点亮备份,当 AddUser 或 DeleteUser 命令被触发时,该属性会引发 NotifyPropertyChanged。

正如我所说,..它有效,但感觉不对。有人有更好的主意吗?

非常感谢。

【问题讨论】:

    标签: silverlight dataform ieditableobject


    【解决方案1】:

    根据我的经验,我知道 DataForm 的使用并不理想,并且有一些限制。话虽这么说,我认为您的解决方案比我提议的解决方案更清洁,但我只是给您一个替代方案。

    我可以告诉您一种使数据表单“忽略”(不是真的)某些属性通知的方法。您可以做的是检查是否引发了某个属性,如果应该忽略该属性,您可以手动忽略将提交按钮重置为之前的状态:

            someViewModel.PropertyChanged += (sender, e) =>
                                                 {
                                                     Grid dependencyObject = VisualTreeHelper.GetChild(TheDataForm, 0) as Grid;
                                                     var commitButton = dependencyObject.FindName("CommitButton") as Button;
                                                     commitButton.IsEnabled = !e.PropertyName.Equals("PropertyToIgnore");
                                                 };
    

    然后您可以通过从数据表单继承并创建一个依赖属性来调整它,您可以在其中绑定要忽略的属性。

    正如我所说,我认为您的解决方案是更清洁的解决方案。

    【讨论】:

      猜你喜欢
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 2023-03-28
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多