Фильтр WPF TreeView с использованием MVVM - PullRequest
2 голосов
/ 29 октября 2010

В настоящее время у меня есть 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 и я хочу, чтобы выбранный элемент в этом ComboBox служил критерием для фильтрации TreeView по.У меня есть ViewModelRepository, который также имеет тип ObservableCollection<SomeItemViewModel> и предоставляется моим контейнером IoC.Я использую это для создания моих других ObservableCollections, которые находятся в XAML выше.

В данный момент я пытаюсь установить Visibility каждого SomeItemViewModel в моем ViewModelRepository, когда выбран элемент в ComboBox.Похоже, что это работает для всего, что находится ниже двух первых уровней в дереве, но не для самого 2-го уровня (первый уровень - это корень, который всегда видим).

Однако он не работает согласованно.Когда я применяю «фильтр», правильные узлы становятся невидимыми, но если я затем расширяю узел, который содержит «фильтрованные» узлы, то все последующие «фильтры» дают сбой.

Я читал о привязке ItemsControls кCollectionViewSource для фильтрации, но я не могу найти пример его использования с TreeView.У кого-нибудь есть указания на то, как я могу использовать его здесь?

1 Ответ

5 голосов
/ 31 октября 2010

вы можете использовать ICollectionView для фильтрации вашей коллекции.что-то вроде этого:

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

                      //check your conditions here
                      ...

                      return (bool)itemtofilercondition;
                    };

edit: вы должны воссоздать представление, если вы вызываете new YourObservableCollection ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...