如何对.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事件处理程序绑定到每个项,并在事件处理程序中检查对象的唯一性,如果检查失败,则标记为无效。它不会阻止用户添加副本,但将新对象标记为无效会防止在用户修复问题之前保存数据。