2017-02-21 6 views
-1

Ich habe eine Elternklasse (Umsetzung INotifyPropertyChanged), die eine Eigenschaft hat, die eine Bindungsliste von (ChildClass) ist. Die ChildClass implementiert auch INotifyPropertyChanged.INotifyPropertyChanged in Kind-Bindungslisten

Wenn ich etwas an den Parent binden, spiegelt es richtig Änderungen an den Parent Eigenschaften - mit Ausnahme von Änderungen an:

  1. Die Anzahl der Elemente in der BindingList(of ChildClass) [als Folge der das Hinzufügen oder Löschen von Elementen In der Liste]. OR
  2. Eine Änderung in einer Eigenschaft eines Elements in der BindingList(of ChildClass)

Wenn ich binden etwas direkt zu einem Element von ChildClass (das heißt ein Element in der BindingList(Of ChildClass)) - geht das auch.

Wie wird dies verkabelt, damit # 1 und # 2 in gebundenen Objekten entsprechend reflektiert werden?

Hier ist die Vb-Version von Pauls große Antwort. Ohne das Ereignis List_Changed wurden Änderungen an der BindingList nicht korrekt in der Kette in einem verschachtelten Geschäftsobjekt weitergegeben. Damit sind sie!

Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 
Private WithEvents m_children As IBindingList 

Public Sub NotifyPropertyChanged(<CallerMemberName()> Optional ByVal propertyName As String = Nothing) 
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName)) 
End Sub 

Public Property Children As IBindingList 
    Get 
     Return m_children 
    End Get 
    Set 
     m_children = Value 
     NotifyPropertyChanged() 
    End Set 
End Property 

Private Sub m_children_ListChanged(sender As Object, e As ListChangedEventArgs) Handles m_children.ListChanged 
    NotifyPropertyChanged(NameOf(Children)) 
End Sub 
+0

Zeigen Sie uns bitte einen Code. – jlvaquero

Antwort

1

BindingList<T> proovides die Veranstaltung BindingList<T>.ListChanged dass

Tritt ein, wenn die Liste oder ein Element in der Liste ändert.

Sie können einfach einen Event-Handler in Ihrer Elternklasse implementieren und ihn an ListChanged anschließen. (Ich habe die Kinder Eigentum angenommen - die BindingList<ChildClass> - zu Children genannt werden)

private void Children_OnListChanged(object sender, EventArgs e) 
{ 
    OnPropertyChanged(nameof(Children)); 
} 

Mit OnPropertyChanged Sie können Abonnenten mitteilen, dass die Children Eigenschaft geändert wurde. Wenn es keine Implementierung in der Klasse ist, noch kann es aussehen wie die folgenden

private void OnPropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
} 

wo [CallerMemberName] (die in System.Runtime.CompilerServices Namespace leben) ist ein Hinweis für den Compiler den Namen der Eigenschaft zu verwenden, die OnPropertyChanged genannt hat wenn kein expliziter Wert übergeben wird.

+1

Phänomenal. Nur einfache Arbeiten. Vielen Dank. – skavan

+0

Froh ich könnte helfen :) –