使用MVVM过滤WPF TreeView

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)

在哪里RootViewModelsChildren类型ObservableCollection<SomeItemViewModel>

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

目前,我正在尝试Visibility在选择ComboBox中的项目时在我的ViewModelRepository中设置每个SomeItemViewModel.这似乎适用于树中前两个级别以下的任何内容,但不适用于第二级本身(第一级是始终可见的根).

但是,它不能始终如一地工作.当我应用"过滤器"时,正确的节点被设置为不可见,但如果我然后展开包含"已过滤"节点的节点,则任何后续"过滤器"都会失败.

我已经读过将ItemsControls绑定到CollectionViewSource以进行过滤,但我找不到它与TreeView一起使用的示例.有没有人对如何在这里使用它有任何指示?

bli*_*eis 5

您可以使用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(),则必须重新创建视图;