0

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

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

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

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

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

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

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

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

非常感谢提前。

4

1 回答 1

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");
                                             };

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

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

于 2011-08-27T15:20:27.600 回答