【问题标题】:View Filter not working for a readonly ObservableCollection查看过滤器不适用于只读的 ObservableCollection
【发布时间】: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&lt;T&gt; 的新实例?
  • @RohitVats 因为,如果底层集合之一发生变化,那么这不会反映在聚合映射中
  • ObservableCollection类型的底层源集合吗?

标签: c# .net wpf .net-4.0 inotifypropertychanged


【解决方案1】:

您必须刷新视图才能重新评估过滤条件。

view.Refresh(); 

【讨论】:

  • 这并不能解决问题。正如我所说,过滤代码被击中
猜你喜欢
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
  • 2021-07-07
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多