【发布时间】:2018-04-11 16:10:10
【问题描述】:
我在对 WPF TreeView 进行过滤时遇到问题。
这是我的 TreeView XAML:
<TreeView x:Name="ResourcesTreeView" ItemsSource="{Binding Path=FilteredResources}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type models:HierarchicalResource}" ItemsSource="{Binding ContainedResources}">
<StackPanel Orientation="Horizontal">
<Image Source="{Binding ResourceIdentifier.ResourceType, Converter={StaticResource ResourceTypeToIconConverter}}"
Stretch="Uniform" Height="23" VerticalAlignment="Center"/>
<TextBlock Text="{Binding Path=Name}" Style="{StaticResource ResourceName}" VerticalAlignment="Center"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.Resources>
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectedItemChanged">
<i:InvokeCommandAction Command="{Binding OnSelectedResourceChangedCommand}"
CommandParameter="{Binding ElementName=ResourcesTreeView, Path=SelectedItem}" />
</i:EventTrigger>
</i:Interaction.Triggers>
这是 HierarchicalResource 类:
public class HierarchicalResource
{
public HierarchicalResource(ResourceIdentifier resourceIdentifier, List<HierarchicalResource> containedResources, string name)
{
this.ResourceIdentifier = resourceIdentifier;
this.ContainedResources = containedResources;
this.Name = name;
}
public ResourceIdentifier ResourceIdentifier { get; }
public List<HierarchicalResource> ContainedResources { get; set; }
public string Name { get; }
}
这就是我初始化 CollectionViewProperty 的方式:
this.FilteredResources = CollectionViewSource.GetDefaultView(resourcesTree);
resourcesTree 是一个包含一个根元素的列表,在其 ContainedResources 属性中包含多个子元素。 它看起来很棒。唯一的问题是,在尝试过滤时它不起作用。 当我尝试使用 this.FilteredResources.Filter = obj => { ... } 时,它只在根节点上发生一次。我怎样才能真正使过滤器委托在每个现有的树节点上执行??
谢谢, 伙计
【问题讨论】:
-
层次结构中的每个列表都需要过滤
-
嗨,安迪,你能给我一些细节吗?如何对每个列表应用过滤器?
-
就个人而言,我会编写一个框架元素转换器,它将谓词作为属性。然后在任何模板的 itemssource 上使用它。
-
抱歉,这对我来说太高了,无法理解您的解决方案。如果您能详细说明一下,我将不胜感激,也许有一个小例子:)
标签: c# wpf treeview collectionview