Уникальные записи WPF в коллекции ObservableCollection - PullRequest
1 голос
/ 14 мая 2011

У меня есть ObservableCollection класса Customers, который я заполняю из запроса к базе данных. Из-за того, как таблицы объединяются, я иногда получаю одноразовые записи (у Билла есть адрес доставки, который отличается от его почтового адреса), которые появляются в данных дважды.
Каждая строка клиента имеет идентификатор в качестве уникального первичного ключа, и это то, что я использую для получения дополнительной информации о клиенте, когда кто-то выбирает строку из связанного ListView. В версии этой программы для WinForms я бы искал в ListView идентификатор клиента, и, если он был найден, я бы не вставлял его повторно.

ObservableCollection, похоже, не в состоянии легко сказать мне, существует ли уже CustomerID в одном из экземпляров класса коллекции, поэтому мне интересно, как лучше всего это обработать.

Идеи, которые у меня были до сих пор:

' Not sure how to make this work, since the CustomerID and Name would be the same, but the city, state, zip might not be.'
t = new classCustomer(CustomerID, CustomerName, City, State, Zip)
if not sr.contains(t) then
  sr.Add(t)
end if

Possibly figure out how to create an ObservableDictionary, but so far all the examples are in C#, and it may take me a while to port it over to VB.net

Кто-нибудь знает о лучшей реализации?

1 Ответ

3 голосов
/ 14 мая 2011

Вам просто нужно сообщить .NET, что определяет человека, в данном случае идентификатор.

Просто переопределите Equals для вашего объекта клиента, и ваша коллекция теперь сможет узнать, эквивалентны ли 2 клиента:

Public Class Person

    Private id As Integer

    Public Sub New(ByVal id As Integer)
        Me.id = id
    End Sub

    Public Overrides Function Equals(ByVal obj As Object) As Boolean

        Return (TypeOf (obj) Is Person) And (DirectCast(obj, Person)).id = Me.id

    End Function

    Public Overrides Function GetHashCode() As Integer
        Return Me.id.GetHashCode()
    End Function

End Class




 Sub Main()

        Dim observable As New ObservableCollection(Of Person)()

        observable.Add(New Person(1))

        Dim duplicate As New Person(1)

        If Not observable.Contains(duplicate) Then
            observable.Add(duplicate) ' never gets hit because of .Equals override
        End If

    End Sub

без переопределения он не знает, как определить, эквивалентны они или нет.

...