【问题标题】:How do you validate items of a .NET collection against each other?如何相互验证 .NET 集合的项目?
【发布时间】:2011-12-02 16:19:49
【问题描述】:

我有一个代表一些业务对象的类,例如:

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 属性的值必须存在于这个整数列表中?

【问题讨论】:

    标签: .net vb.net validation collections


    【解决方案1】:

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

    (使用这种新方法的唯一原因是为了优雅地处理尝试添加新记录的情况,但这种尝试应该被拒绝;另一种方法是覆盖 InsertItem 并在规则生效时抛出异常验证。)

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

    您可以重写 ObservableCollections Remove 方法以移除事件侦听器并确保移除的对象可以被垃圾回收。

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

    【讨论】:

    • 这让我想到了正确的方向。当新项目添加到集合中时,我将 Property_Changed 事件处理程序绑定到每个项目,并在事件处理程序中检查对象的唯一性,如果检查失败,则将其标记为无效。它不会阻止用户添加副本,但将新对象标记为无效会阻止数据保存,直到用户解决问题。
    猜你喜欢
    • 2023-03-16
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    相关资源
    最近更新 更多