如何相互验证.NET集合的项目?

时间:2011-12-02 16:19:50

标签: .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
        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属性的值必须存在于此整数列表中?

1 个答案:

答案 0 :(得分:1)

一个可能的选择是使用一个特定的添加方法(例如AddRecord),用于将所有记录添加到集合中(如果合法添加它们)。

(拥有这种新方法的唯一原因是优雅地处理尝试添加新记录的场景,但是这种尝试应该被拒绝;另一种方法是覆盖InsertItem并在规则出现时抛出异常验证。)

当记录添加到集合中时,您可以将集合中的事件侦听器连接到INotifyPropertyChanged.OnPropertyChanged事件,以便侦听对MyVariable属性的更改。不幸的是,此时唯一的选择是在遇到重复时抛出异常,但这总比没有好。

您可以覆盖ObservableCollections Remove方法,以删除事件侦听器并确保可以对已删除的对象进行垃圾回收。

希望这会给你一些关于如何解决问题的想法。