Как вы проверяете элементы коллекции .NET друг против друга? - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть класс, который представляет некоторый бизнес-объект, такой как:

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 Ответ

1 голос
/ 03 декабря 2011

Один из возможных вариантов для этого - иметь определенный метод добавления (например, AddRecord), который вы используете для добавления всех записей в коллекцию, если это законно, чтобы добавить их.

(Единственная причина использования этого нового метода - изящная обработка сценариев, в которых делается попытка добавить новую запись, но эта попытка должна быть отклонена; альтернатива - переопределить InsertItem и вызвать исключение, когда правила ПРОВЕРЯЕМЫЕ.)

Когда запись добавляется в коллекцию, вы можете подключить прослушиватель событий в коллекции к событию INotifyPropertyChanged.OnPropertyChanged, чтобы прослушивать изменения свойства MyVariable. К сожалению, единственная возможность на данный момент - выдать исключение, если обнаружен дубликат, но это лучше, чем ничего.

Вы можете переопределить метод Remove ObservableCollections, чтобы удалить прослушиватель событий и убедиться, что удаленный объект можно собирать мусором.

Надеюсь, это даст вам некоторые идеи о том, как подойти к вашей проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...