Matt Hamsmith
Matt Hamsmith

Reputation: 4036

How do you validate items of a .NET collection against each other?

I have a class that represents some business object, such as this:

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 implements both INotifyPropertyChanged and IDataErrorInfo, such that a Validate method will populate the appropriate IDataErrorInfo fields when setting the property values.

I also have a collection that supports change events, which I eventually bind to a WPF DataGrid.

Public Class MyCollection
    Inherits ObservableCollection(Of MyObject)
End Class

Part 1: Let's say that I have a business rule which says that no two items in my collection may have the same value for MyVariable. How do I set up my events (or implement additional interfaces somewhere) to perform this cross-item validation whenever the property value changes on any item in the collection?

Part 2: Suppose I have a list of integers such that whenever I add a new MyObject item to an instance of MyCollection or change the MyVariable property on any item already in the collection, the value of the MyVariable property must exist in this list of integers?

Upvotes: 0

Views: 353

Answers (1)

competent_tech
competent_tech

Reputation: 44931

One possible option for this is to have a specific add method (such as AddRecord) that you use to add all of the records to the collection if it is legal to add them.

(The only reason for having this new method is to gracefully handle scenarios in which an attempt is made to add a new record, but this attempt should be rejected; the alternative is to override InsertItem and throw an exception when the rules are validated.)

When a record is added to the collection, you can hook up an event listener within the collection to the INotifyPropertyChanged.OnPropertyChanged event in order to listen for changes to the MyVariable property. Unfortunately, the only option at this point is to throw an exception if a duplicate is encountered, but that is better than nothing.

You can override the ObservableCollections Remove method in order to remove the event listener and ensure the removed object can be garbage collected.

Hopefully, this will give you some ideas on how to approach your problem.

Upvotes: 1

Related Questions