代码之家  ›  专栏  ›  技术社区  ›  alimbada

使用MVVM筛选WPF TreeView

  •  2
  • alimbada  · 技术社区  · 15 年前

    我现在有一个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>
    

    哪里 RootViewModels Children 属于类型 ObservableCollection<SomeItemViewModel>

    同样的观点我有一个 ComboBox 我想让选中的项目 作为筛选 TreeView 可观察集合<SomeItemViewModel> 由我的IoC容器提供。我使用这个来创建位于上面XAML中的其他可观察集合。

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

    然而,它并不能始终如一地工作。当我应用“filter”时,正确的节点被设置为不可见,但是如果我随后展开一个包含“filtered”节点的节点,则任何后续的“filter”都将失败。

    1 回复  |  直到 15 年前
        1
  •  5
  •   blindmeis    15 年前

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

    ICollectionView view = CollectionViewSource.GetDefaultView(this.YourObservableCollection);
    view.Filter = o => {
                          var itemtofilter = o as yourviewmodeltype;
    
                          //check your conditions here
                          ...
    
                          return (bool)itemtofilercondition;
                        };