我上课了:
public class A : INotifyPropertyChanged
{
public List<B> bList { get; set; }
public void AddB(B b)
{
bList.Add(b);
NotifyPropertyChanged("bList");
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
和绑定(UserControl的DataContext是A的一个实例):
<ListBox ItemsSource="{Binding Path=bList}" />
显示元素,将新对象添加到List后ListBox不会更新
将列表更改为ObservableCollection并删除NotifyPropertyChanged处理程序后,一切正常。
为什么列表不起作用?
你的财产必须是 public
,或绑定引擎将无法访问它。
编辑:
将列表更改为ObservableCollection并删除NotifyPropertyChanged处理程序后,一切正常。
这正是为什么 ObservableCollection<T>
上课了...... ObservableCollection<T>
器物 INotifyCollectionChanged
,允许它在添加/删除/替换项目时通知UI。 List<T>
不会触发任何通知,因此UI无法检测列表内容何时发生更改。
事实上你提高了 PropertyChanged
事件确实刷新了绑定,但后来它意识到它是同一个实例 List<T>
和以前一样,所以重复使用它 ICollectionView
作为 ItemsSource
,以及的内容 ListBox
没有刷新。
我认为问题是,虽然您通知绑定框架该属性已更改,但该属性的实际值仍然相同。也就是说虽然列表框可能会重新评估其ItemsSource绑定的值,但它会发现它仍然是相同的 对象实例 如从前那样。例如,假设列表框以某种方式对属性更改事件作出反应,类似于下面的内容。
private void OnItemsSourceBindingChanged()
{
var newValue = this.EvaluateItemsSourceBinding();
if (newValue != this.ItemsSource) //it will be equal, as its still the same list
{
this.AddNewItems();
}
}
在您的示例中,这意味着它不会重新评估项目。
注意:我没有 知道 列表框如何与ItemsSource属性一起使用 - 我只是在猜测!
ObservableCollections发送 CollectionChanged 事件不是PropertyChanged事件
通过信号
NotifyPropertyChanged("bList");
你基本上说你有一个新的 名单 对象,而不是列表的内容已更改。
如果将类型更改为ObservableCollection,则集合会自动发送
CollectionChanged
该集合的通知 项目 已经改变了,这就是你想要的。