2017-02-21 11 views
-1

У меня есть родительский класс (реализация INotifyPropertyChanged), у которого есть Свойство, которое является списком привязки (ChildClass). ChildClass также реализует INotifyPropertyChanged.INotifyPropertyChanged в дочерних привязных списках

Если я связать что-то к ParentClass, он правильно отражает изменения в свойства ParentClass - за исключением изменений в:

  1. Число элементов в BindingList(of ChildClass) [в результате добавления или удаления элементов в списке]. ИЛИ
  2. Изменение в свойстве элемента в BindingList(of ChildClass)

Если я связать что-то непосредственно к пункту ChildClass (то есть пункт, в BindingList(Of ChildClass)) - что тоже работает.

Как подключить это так, чтобы # 1 и # 2 были соответствующим образом отражены в связанных объектах?

Вот версия Vb отличного ответа Павла. Без события List_Changed изменения в BindingList не были правильно распространены по цепочке во вложенном бизнес-объекте. С этим они!

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

Покажите нам, пожалуйста, код. – jlvaquero

ответ

1

BindingList<T> proovides событию BindingList<T>.ListChanged что

Происходит, когда список или элемент в списке изменяется.

Вы можете легко реализовать обработчик событий в своем родительском классе и подключить его к ListChanged. (Я взял на себя собственность детей - BindingList<ChildClass> - быть названной Children)

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

С OnPropertyChanged вы можете уведомить абонент, что Children свойства изменилось. Если нет реализации в классе, тем не менее, это может выглядеть следующим образом

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

где [CallerMemberName] (который живет в System.Runtime.CompilerServices пространства имен), намек на компилятор использовать имя свойства, которое называется OnPropertyChanged если явное значение не передано.

+1

Феноменальный. Просто равные произведения. Спасибо. – skavan

+0

Рад, что я мог бы помочь :) –

Смежные вопросы