WPF: фильтр TreeView без свертывания его узлов - PullRequest
1 голос
/ 23 апреля 2010

Этот вопрос является последующим вопросом.

Я фильтрую узлы верхнего уровня элемента управления TreeView, как показано ниже.

private void ApplyFilterHandler(object sender, RoutedEventArgs e)
{
    if (_filterCheckBox.IsChecked.Value)
        CollectionViewSource.GetDefaultView(TopLevelNodes).Filter += MyFilter;
    else
        CollectionViewSource.GetDefaultView(TopLevelNodes).Filter -= MyFilter;
}  

.

<TreeView ItemsSource="{Binding TopLevelNodes}">
  ...
</TreeView>

Когда пользователь применяет фильтр, все узлы сворачиваются.

Вопрос
Как я могу скрыть определенные узлы в дереве, сохраняя при этом состояние раскрытия других узлов?
Может кто-нибудь объяснить, что происходит внутри ICollectionView.Filter += MyFilter.

Спасибо за ваше время.

1 Ответ

0 голосов
/ 23 апреля 2010

В таких случаях, как этот Отражатель всегда ваш друг. Я предполагаю, что ICollectionView.Refresh() вызывается внутри, чтобы отразить изменения, вызванные добавлением / удалением фильтра. Это эффективно повторно перечисляет узлы в TreeView.

Чтобы компенсировать это, вы всегда можете получить состояние всех элементов дерева и повторно применить их после обновления. Возможно, это не то простое решение, которое вы искали.

Вы также можете попытаться установить MyFilter один раз и вызвать ICollectionView.Refresh() программно. Ваш MyFilter должен затем фильтровать в соответствии со значением _filterCheckBox.IsChecked. Это может иметь значение, но это всего лишь идеи. Вы должны попробовать их сами.

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