【发布时间】:2014-03-04 17:02:31
【问题描述】:
我有一个财产:
public ObservableCollection<Mapping> Mapping
{
get { return new ObservableCollection<Mapping>(_standardMappings
.Union(_userDefinedMappings)); }
}
在向基础集合添加/删除新项目时触发 (OnPropertyChanged)。
我绑定到ListView,除了过滤之外一切正常。我正在做如下过滤:
var view = CollectionViewSource.GetDefaultView(Mapping);
view.Filter = filteringPredicate;
过滤代码被命中,但ListView 永远不会改变它的视图。我可以通过做这样的事情来让它工作
private ObservableCollection<Mapping> _mappings;
public ObservableCollection<Mapping> Mappings { get{ return _mappings; } }
并且,在OnCollectionChanged 的基础集合中:
private void OnMappingCollectionChanged()
{
_standardMappings.CollectionChanged -= OnMappingCollectionChanged;
_userDefinedMappings.CollectionChanged -= OnMappingCollectionChanged;
_buttonMappings.Clear();
_standardMappings.ToList().ForEach(mapping=>_mappings.Add(mapping));
_userDefinedMappings.ToList().ForEach(mapping=>_mappings.Add(mapping));
_standardmMappings.CollectionChanged += OnMappingCollectionChanged;
_userDefinedMappings.CollectionChanged += OnMappingCollectionChanged;
}
然而,这是一个非常糟糕的解决方案 IMO
而且,我确实看过CompositeCollection,但you cannot filter on them
【问题讨论】:
-
第二个代码确实有意义。为什么需要始终返回
ObservableCollection<T>的新实例? -
@RohitVats 因为,如果底层集合之一发生变化,那么这不会反映在聚合映射中
-
是
ObservableCollection类型的底层源集合吗?
标签: c# .net wpf .net-4.0 inotifypropertychanged