如何对.NET集合中的项进行相互验证?
我有一个表示某些业务对象的类,例如:如何对.NET集合中的项进行相互验证?,.net,vb.net,validation,collections,.net,Vb.net,Validation,Collections,我有一个表示某些业务对象的类,例如: Public Class MyObject Inherits SomeBaseObject ' Implements INotifyPropertyChanged and IDataErrorInfo Private mMyVariable as Integer Public Property MyVariable as Integer Get Return mMyVariable
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数据网格
Public Class MyCollection
Inherits ObservableCollection(Of MyObject)
End Class
第1部分:假设我有一条业务规则,其中规定我的集合中没有两个项目对MyVariable
具有相同的值。当集合中任何项的属性值发生更改时,如何设置事件(或在某处实现其他接口)以执行此跨项验证
第2部分:假设我有一个整数列表,每当我向
MyCollection
的实例添加一个新的MyObject
项,或更改集合中任何已存在项的MyVariable
属性时,MyVariable
属性的值必须存在于这个整数列表中?一个可能的选择是使用一个特定的添加方法(例如AddRecord),如果添加记录是合法的,您可以使用该方法将所有记录添加到集合中
(使用此新方法的唯一原因是为了优雅地处理尝试添加新记录的情况,但应拒绝此尝试;另一种方法是重写InsertItem并在验证规则时引发异常。)
将记录添加到集合时,可以将集合中的事件侦听器连接到INotifyPropertyChanged.OnPropertyChanged事件,以便侦听MyVariable属性的更改。不幸的是,此时唯一的选择是在遇到重复时抛出异常,但这总比什么都没有好
您可以重写ObservableCollections移除方法,以移除事件侦听器并确保移除的对象可以被垃圾收集
希望这能给你一些解决问题的方法。这让我朝着正确的方向思考。在向集合中添加新项时,我将一个属性_Changed事件处理程序绑定到每个项,并在事件处理程序中检查对象的唯一性,如果检查失败,则标记为无效。它不会阻止用户添加副本,但将新对象标记为无效会防止在用户修复问题之前保存数据。