ali*_*ada 2 wpf treeview filter mvvm
我目前有一个TreeView,它具有以下结构:
<TreeView ItemsSource="{Binding RootViewModels}"
FontSize="12">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="local:TreeViewItemBehaviour.IsBroughtIntoViewWhenSelected"
Value="True" />
<Setter Property="IsExpanded"
Value="{Binding IsExpanded, Mode=TwoWay}" />
<Setter Property="IsSelected"
Value="{Binding IsSelected, Mode=TwoWay}" />
<Setter Property="Visibility"
Value="{Binding IsVisible, Mode=TwoWay, Converter={StaticResource boolVisibilityConverter}}" />
</Style>
</TreeView.ItemContainerStyle>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<TextBlock Text="{Binding SomeDisplayText}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Run Code Online (Sandbox Code Playgroud)
在哪里RootViewModels和Children类型ObservableCollection<SomeItemViewModel>
在同一个视图中,我有一个ComboBox,我希望其中的选定项目ComboBox作为筛选依据的条件TreeView.我有一个ViewModelRepository,它也是类型ObservableCollection<SomeItemViewModel>,由我的IoC容器提供.我用它来创建上面XAML中的其他ObservableCollections.
目前,我正在尝试Visibility在选择ComboBox中的项目时在我的ViewModelRepository中设置每个SomeItemViewModel.这似乎适用于树中前两个级别以下的任何内容,但不适用于第二级本身(第一级是始终可见的根).
但是,它不能始终如一地工作.当我应用"过滤器"时,正确的节点被设置为不可见,但如果我然后展开包含"已过滤"节点的节点,则任何后续"过滤器"都会失败.
我已经读过将ItemsControls绑定到CollectionViewSource以进行过滤,但我找不到它与TreeView一起使用的示例.有没有人对如何在这里使用它有任何指示?
您可以使用ICollectionView过滤您的集合.这样的事情:
ICollectionView view = CollectionViewSource.GetDefaultView(this.YourObservableCollection);
view.Filter = o => {
var itemtofilter = o as yourviewmodeltype;
//check your conditions here
...
return (bool)itemtofilercondition;
};
Run Code Online (Sandbox Code Playgroud)
编辑:如果调用new YourObservableCollection(),则必须重新创建视图;