我有一个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
中仅显示已过滤的结果?
答案 0 :(得分:3)
如果您不想在原始源集合中进行排序和过滤,而不是获取defaultView
源代码集,请创建新的CollectionViewSource
并将其视图分配给ViewMacros
-
ViewMacros = new CollectionViewSource() { Source = CreatedMacros }.View;
<强>更新强>
当您绑定到任何集合ObservableCollection
时,WPF绑定引擎会在集合内部创建一个View并绑定到该集合。它可以是ListCollectionView
或ICollectionView
的其他衍生版本。
请记住,我们永远不会直接绑定到集合;有 始终是我们绑定到的集合顶部的视图。如果您未提供任何视图,则会在幕后创建默认视图。
因此,当您要求CollectionViewSource.GetDefaultView()
时,它将返回它在该集合内部创建的视图。因此,任何过滤和排序都将应用于相同的集合,而两者都指向相同的视图。