У меня возникают проблемы с фильтрацией иерархических данных, отображаемых во вложенных шаблонах xaml.
У меня есть ObservableCollection<Foo> Foos
, который я показываю в XAML.
Допустим, Foo выглядит так:
class Foo
{
public ObservableCollection<Bar> Bars;
}
class Bar
{
public ObservableCollection<Qux> Quxes;
}
Я показываю Foos со следующим xaml:
<Grid>
<Grid.Resources>
<CollectionViewSource x:Key="MyCVS" Source="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}}, Path=DataContext.UnifiedSymbols}" Filter="MyCVS_Filter" />
<DataTemplate x:Key="NestedTabHeaderTemplate">
<TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>
<DataTemplate x:Key="NestedTabContentTemplate">
<ListBox ItemsSource="{Binding Path=Quxes}" DisplayMemberPath="Name"/>
</DataTemplate>
<DataTemplate x:Key="TopLevelTabHeaderTemplate">
<TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>
<DataTemplate x:Key="TopLevelTabContentTemplate">
<TabControl ItemsSource="{Binding Path=Bars}"
ItemTemplate="{StaticResource NestedTabHeaderTemplate}"
ContentTemplate="{StaticResource NestedTabContentTemplate}"
/>
</DataTemplate>
</Grid.Resources>
<TabControl ItemSource="{Binding correct binding for my control's collection of Foos}"
ItemTemplate="{StaticResource TopLevelTabHeaderTemplate}"
ContentTemplate="{StaticResource TopLevelTabContentTemplate}"
x:Name="tabControl"
/>
</Grid>
Чтобы выразить это словами, есть элемент управления вкладками, с вкладкой для каждого Foo. Каждый Foo представляет собой элемент управления вкладками, и каждый элемент Bar находится на отдельной вкладке. Каждый бар содержит список своих Quxes.
or:
______ ______ ______
| Foo1 | Foo2 | Foo3 |
|______ ______ |
| Bar1 | Bar2 |______|
| | qux1 ||
| | qux2 ||
| | qux3 ||
----------------------
У меня также есть TextBox, который я хотел бы использовать для фильтрации этой разбивки. Когда я ввожу текст в текстовое поле, я хочу фильтровать quxes, чтобы те, которые не содержат текста, не были видны. В идеале Bar
вкладок также должны быть скрыты, если на них нет видимых quxes, и Foo
вкладок скрыты, если на них нет видимых Bar
вкладок
Я рассмотрел два подхода:
Подход 1, сброс свойства Filter в соответствующем CollectionViewSources.
В событии TextChanged моего текстового поля я перебираю запрос Foo о соответствующем (статическом) TabControl CollectionViewSource:
foreach(Foo foo in tabControl.Items)
{
var tabItem = tabControl.ItemContainerGenerator.ContainerFromItem(foo); // This is always of type TabItem
// How do I get the TabControl that will belong to each of Foo's Bar's?
}
Подход 2, объявите ItemSource ListView в CollectionViewSource
Я попытался настроить фильтр через xaml, изменив эту строку:
<ListBox ItemsSource="{Binding Path=Quxes}" DisplayMemberPath="Name">
к этому,
<CollectionViewSource x:Key="MyCVS" Source="?????" Filter="MyCVS_Filter" />
...
<ListBox ItemsSource="{Binding Source={StaticResource MyCVS}}" DisplayMemberPath="Name">
Я пробовал несколько вещей, где у меня есть "?????" но я не могу правильно привязаться к контексту данных ListBox и соответствующему члену Quxes. Ничто из того, что я пытаюсь сделать, не приводит к отображению quxs, и я не получаю никаких ошибок на консоли. Даже если бы я мог заставить этот подход работать, я не уверен, как бы я повторно активировал этот фильтр, когда текст в поле поиска изменился.
Любые советы или направления будут оценены.