我对Silverlight DataForm和子集合有一个有趣的问题。我也有一个有效的解决方案,但感觉就像一个黑客(是一个黑客),我想知道是否有人有更优雅的解决方案。
我有一个绑定到GroupViewModel集合的DataForm。每个GroupViewModel都有一个UserViewModel的ObservableCollection,我希望用户能够在显示DataForm的EditTemplate时添加和删除。
用于执行此操作的UI是一个简单的ComboBox,其中包含所有用户的列表以及当前位于该组中的用户的ListBox。有一个添加和删除按钮可以将用户从一个列表移动到另一个列表。
现在,... DataForm绑定的视图模型实现IEditableObject,..这很酷,因为如果编辑被取消,我会得到回滚行为,但在这种情况下,它还不够。我需要一种告诉DataForm我的VM是否处于脏状态或不显式的方法。
由于我的ViewModel具有SelectedUserToAdd属性,其中所有用户ComboBox的SelectedItem绑定到该属性,当用户选择要添加的用户时,PropertyChanged事件将在我的VM上触发,并且DataForm认为某些内容已更改并且提交( OK)按钮亮起。 由于SelectedUserToRemove属性,在ListBox中更改选择时它也会亮起。
显然,如果ListBox中的UserViewModel发生了变化,我想要的是提交按钮点亮。
解决方案很简单。如果我从SelectedUserToAdd和SelectedUserToRemove属性中删除更改通知,我可以停止提交按钮点亮,我可以得到 通过使用名为“Dirty”的虚拟属性来提交按钮,以便在AddUser或DeleteUser命令被触发时引发NotifyPropertyChanged。
正如我所说,......它有效,但感觉不对。谁有更好的主意?
提前非常感谢。
答案 0 :(得分: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");
};
然后,您可以通过继承数据形式并创建依赖项属性来调整它,您可以在其中绑定要忽略的属性。
正如我所说,我认为你的解决方案更清晰。