过滤收集问题

时间:2013-11-17 14:54:52

标签: c# wpf collections

我有一个ComboBox,其中包含一系列自定义对象:

<ComboBox ItemsSource="{Binding CreatedMacros}" Width="150" Height="25"  
          HorizontalAlignment="Left" Margin="10"                                
          DisplayMemberPath="Name"
          SelectedItem="{Binding SelectedMacro}"/>

在其他地方,我有一个ItemsControl,其中有一个与之绑定的视图:

<ItemsControl x:Name="stackMacros" ItemsSource="{Binding ViewMacros}">

以这种方式定义视图:

    private ICollectionView _viewMacros;
    public ICollectionView ViewMacros
    {
        get
        {
            return _viewMacros;
        }
        set
        {
            _viewMacros = value;
            RaisePropertyChanged("ViewMacros");
        }
    }

并按照以下方式进行初始化和过滤:

         ViewMacros = CreatedMacros as ICollectionView;
         ViewMacros = CollectionViewSource.GetDefaultView(CreatedMacros);

         ViewMacros.Filter = delegate(object o)
         {
             if (((Macro)o).PrivateMacro== false)
             {
                 return true;
             }
             return false;
         };

问题是在这两个地方我都得到了过滤结果。我的目标是在编辑器中编辑一些宏,并在其他地方将它们显示为按钮。但是只有非私有宏应该存在,这就是我使用过滤器的原因,区别于PrivateMacro属性。

如何在ComboBox整个集合和ItemsControl中仅显示已过滤的结果?

1 个答案:

答案 0 :(得分:3)

如果您不想在原始源集合中进行排序和过滤,而不是获取defaultView源代码集,请创建新的CollectionViewSource并将其视图分配给ViewMacros -

ViewMacros = new CollectionViewSource() { Source = CreatedMacros }.View; 

<强>更新

当您绑定到任何集合ObservableCollection时,WPF绑定引擎会在集合内部创建一个View并绑定到该集合。它可以是ListCollectionViewICollectionView的其他衍生版本。

  

请记住,我们永远不会直接绑定到集合;有   始终是我们绑定到的集合顶部的视图。如果您未提供任何视图,则会在幕后创建默认视图。

因此,当您要求CollectionViewSource.GetDefaultView()时,它将返回它在该集合内部创建的视图。因此,任何过滤和排序都将应用于相同的集合,而两者都指向相同的视图。