我有一个 ObservableCollection<T>
.我已将它绑定(bind)到 ListBox 控件并添加了 SortDescriptions
到 ListBox 上的 Items 集合,使列表按我想要的方式排序。
当子元素上的任何属性发生更改时,我想在任何 点对列表求助。
我所有的子元素都实现了 INotifyPropertyChanged
.
最佳答案
蛮力:
- 将处理程序附加到每个子项的每个 PropertyChanged 事件
- 从 CollectionViewSource 中获取 ListCollectionView
- 调用 Refresh。
编辑:
1、2 的代码将存在于您的代码隐藏中。
对于#1,你会做类似的事情:
private void Source_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
foreach( SomeItem item in e.NewItems)
{
item.PropertyChanged += new PropertyChangedEventHandler(_SomeItem_PropertyChanged);
}
break;
....
**HANDLE OTHER CASES HERE**
....
}
}
对于 #2,在您的 CollectionChanged 处理程序中,您可以执行如下操作:
private void _SomeItem_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
ListCollectionView lcv = (ListCollectionView)(CollectionViewSource.GetDefaultView(theListBox.ItemsSource));
lcv.Refresh();
}
编辑2: 但是,在这种情况下,我会强烈建议您也检查 ListCollectionView.NeedsRefresh 并仅在已设置时刷新。如果您的属性已更改但不影响排序,则没有理由重新排序。
关于c# - 集合中项目的可观察集合属性发生了变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1015126/