我有一个代表某个业务对象的类,例如:
Public Class MyObject
Inherits SomeBaseObject ' Implements INotifyPropertyChanged and IDataErrorInfo
Private mMyVariable as Integer
Public Property MyVariable as Integer
Get
Return mMyVariable
End Get
Set(ByVal value as Integer)
mMyVariable = value
OnPropertyChanged("MyVariable")
Validate()
End Set
End Property
Private Sub Validate()
' Validate fields and set IDataInfoError errors as needed.
End Sub
End Class
SomeBaseObject同时实现了INotifyPropertyChanged和IDataErrorInfo,这样在设置属性值时,Validate方法将填充相应的IDataErrorInfo字段。
我还有一个支持更改事件的集合,我最终将其绑定到WPF DataGrid。
Public Class MyCollection
Inherits ObservableCollection(Of MyObject)
End Class
第1部分:假设我有一条商家规则,即我的收藏品中没有两件商品可能具有MyVariable
的相同价值。如果属性值在集合中的任何项目上发生更改,我如何设置我的事件(或在某处实现其他接口)来执行此跨项目验证?
第2部分:假设我有一个整数列表,每当我向MyObject
的实例添加新MyCollection
项或更改MyVariable
时对于集合中已有的任何项的属性,MyVariable
属性的值必须存在于此整数列表中?
答案 0 :(得分:1)
一个可能的选择是使用一个特定的添加方法(例如AddRecord),用于将所有记录添加到集合中(如果合法添加它们)。
(拥有这种新方法的唯一原因是优雅地处理尝试添加新记录的场景,但是这种尝试应该被拒绝;另一种方法是覆盖InsertItem并在规则出现时抛出异常验证。)
当记录添加到集合中时,您可以将集合中的事件侦听器连接到INotifyPropertyChanged.OnPropertyChanged事件,以便侦听对MyVariable属性的更改。不幸的是,此时唯一的选择是在遇到重复时抛出异常,但这总比没有好。
您可以覆盖ObservableCollections Remove方法,以删除事件侦听器并确保可以对已删除的对象进行垃圾回收。
希望这会给你一些关于如何解决问题的想法。