使用MVVM过滤WPF TreeView

3

我目前有一个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>

RootViewModelsChildren的类型均为ObservableCollection<SomeItemViewModel>

同一视图中,我有一个ComboBox,我希望这个ComboBox中选择的项目作为筛选TreeView的依据。我有一个ViewModelRepository,它也是ObservableCollection<SomeItemViewModel>类型,并由我的IoC容器提供。我使用它来创建在上面XAML中的其他ObservableCollections

目前,我正试图在选择ComboBox中的项目时设置我的ViewModelRepository中每个SomeItemViewModelVisibility属性。这似乎对树中第一级以下的任何内容都有效,但对于第二级本身(第一级始终可见)则无效。

然而,它并不总是有效。当我应用“筛选”时,正确的节点会被设置为不可见,但如果我展开包含“已筛选”节点的节点,则任何随后的“筛选”都将失败。

我已经阅读了关于将ItemsControls绑定到CollectionViewSource以进行筛选的文章,但我找不到它与TreeView的使用示例。有人可以为我指点如何在这里使用它吗?


相关内容:https://dev59.com/U3M_5IYBdhLWcg3wlETO#12377822#12377822 - CAD bloke
1个回答

8

您可以使用ICollectionView来筛选您的集合。就像这样:

ICollectionView view = CollectionViewSource.GetDefaultView(this.YourObservableCollection);
view.Filter = o => {
                      var itemtofilter = o as yourviewmodeltype;

                      //check your conditions here
                      ...

                      return (bool)itemtofilercondition;
                    };

编辑:如果您调用new YourObservableCollection(),则必须重新创建视图。


1
谢谢!这让我找到了正确的方向。终于理解了CollectionViewSource和ICollectionView。 :-) 我只需要添加一个迭代器来过滤根视图模型的每个子视图模型,这样就可以递归地过滤整个层次结构了。 - alimbada

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接