我有一个绑定到CollectionViewSource的WPF ListView.它的源绑定到一个属性,如果用户选择一个选项,该属性可能会更改.
当列表视图源由于属性更改事件而更新时,所有内容都会正确更新,但视图不会刷新以考虑CollectionViewSource过滤器中的任何更改.
如果我将一个处理程序附加到Source属性绑定的Changed事件,我可以刷新视图,但这仍然是旧视图,因为绑定尚未更新列表.
有什么好的方法可以在源更改时刷新视图并重新评估过滤器?
干杯
也许有点晚了,但这可能对其他用户有帮助,所以无论如何我都会发帖...
框架不支持基于PropertyChanged事件更新CollectionView.Filter.围绕这个有很多解决方案.
1)在集合中的对象上实现IEditableObject接口,并在更改过滤器所基于的属性时调用BeginEdit和EndEdit.您可以在Dr.WPF的优秀博客上阅读更多相关信息:Dr.WPF的可编辑收藏
2)创建以下类并在更改的对象上使用RefreshFilter函数.
public class FilteredObservableCollection: ObservableCollection { public void RefreshFilter(T changedobject) { OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, changedobject, changedobject)); } }
例:
public class TestClass : INotifyPropertyChanged { private string _TestProp; public string TestProp { get{ return _TestProp; } set { _TestProp = value; RaisePropertyChanged("TestProp"); } } public event PropertyChangedEventHandler PropertyChanged; protected void RaisePropertyChanged(string propertyName) { var handler = this.PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } } FilteredObservableCollectionTestCollection = new FilteredObservableCollection (); void TestClass_PropertyChanged(object sender, PropertyChangedEventArgs e) { switch (e.PropertyName) { case "TestProp": TestCollection.RefreshFilter(sender as TestClass); break; } }
在创建TestClass对象时订阅它的PropertyChanged事件,但不要忘记在删除对象时取消挂钩事件处理程序,否则可能导致内存泄漏
要么
将TestCollection注入TestClass并使用TestProp setter中的RefreshFilter函数.无论如何,这里的魔力是由NotifyCollectionChangedAction.Replace完成的,它完全更新了项目.