Reputation: 4036
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
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