我在筛选嵌套的XAML模板中显示的分层数据时遇到问题。
我有一个
ObservableCollection<Foo> Foos
,我在XAML中显示的。
假设foo看起来像:
class Foo
{
public ObservableCollection<Bar> Bars;
}
class Bar
{
public ObservableCollection<Qux> Quxes;
}
我将使用以下XAML显示foos:
<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都是一个选项卡控件,其中每个栏都包含在自己的选项卡中。每一个酒吧都有一个其曲的列表框。
或:
______ ______ ______
| Foo1 | Foo2 | Foo3 |
|______ ______ |
| Bar1 | Bar2 |______|
| | qux1 ||
| | qux2 ||
| | qux3 ||
----------------------
我还有一个文本框,我想用它来过滤这个细目。
当我在文本框中键入时,我想过滤quxes,以便不包含文本的不可见。
理想的
Bar
如果标签没有可见的quxes,它们也将被隐藏,并且
Foo
选项卡不可见时隐藏
酒吧
S
我考虑了两种方法:
方法1,在适当的CollectionViewSources上重置Filter属性
在我的文本框的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,将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">
我在哪里试过很多东西??????”但我无法正确绑定到列表框的DataContext和适当的Quxes成员。我尝试的任何操作都不会导致显示quxes,并且在控制台上也不会出现任何错误。即使我可以使用这种方法,我也不确定当搜索框中的文本发生变化时,我将如何重新触发这个过滤器。
如有任何建议或指示,将不胜感激。