2017-02-21 51 views
-1

我有一个父类(实现INotifyPropertyChanged),有一个属性是绑定列表(ChildClass)。 ChildClass也执行INotifyPropertyChangedINotifyPropertyChanged在子绑定列表

如果我绑定的东西给父类,它正确地反映变化的父类的属性 - 与变化的例外:

  1. 元素在BindingList(of ChildClass) [数量,添加或删除项目的结果在列表中]。 OR
  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

现象。 Just Plain Works。谢谢。 – skavan

+0

很高兴我能帮忙:) –

相关问题