【问题标题】:How to filter a TreeView in WPF?如何在 WPF 中过滤 TreeView?
【发布时间】: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


【解决方案1】:

这不适合一堆 cmets,所以我会尝试在答案中解释。 (我没有时间写一个完整的示例。)

从基础开始,这样您就可以清楚地了解我在说什么。 树视图中的内容由树视图项组成。
treeviewitem 是一个带标题的项目控件。 这就是您看到的文本是“标题”属性的原因。 在分层模板中,您有一个 itemssource 绑定。
这是位于父树视图项内的项目控件的项目源。
这就是您的问题的原因。
如果treeviewitems,您要过滤的只是顶层。
您没有过滤其中的项目控件。
或者它们每个中的项目控件......等等。

有两条路可以走。

您可以在视图中进行过滤。

您可以在视图模型中进行过滤。

我们先来谈谈ViewModel
您绑定到一个列表。
当您这样做时,会自动生成一个集合视图。
您可以获得对此的引用并对其应用过滤器。几乎就像他们设计的那样,您可以轻松绑定,但需要多做一些工作,然后您可以排序 + 过滤。

你应该在谷歌上搜索一下,但粗略地说是这样的:

var view1 = CollectionViewSource.GetDefaultView(source);

您可能必须强制转换为 collectionview 或 listcollectionview。 这些具有谓词过滤。 像这样:
https://social.technet.microsoft.com/wiki/contents/articles/26673.wpf-collectionview-tips.aspx#Filtering
有一个与该文章关联的示例,您可以根据您的列表绑定到显式的集合视图。

或者。
您可以在视图中执行此操作。
我建议您看一下这个,但要使用视图模型过滤。

这比较困难,但意味着您的过滤器可以使用 XAML。 我这样做的方法是使用转换器,但它也是一个框架元素。 赞这个http://drwpf.com/blog/category/value-converters/

这也可以具有转换器可以使用的一个(或多个)属性。
这是一个除数转换器:

public class DivideByConverter : MarkupExtension, IValueConverter
{
    public double Divisor { get; set; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double bound = System.Convert.ToDouble(value);
        return bound / Divisor;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

使用:

<ScaleTransform ScaleX="{Binding Path=ActualWidth, RelativeSource={RelativeSource AncestorType=Button}
    , Converter={local:DivideByConverter Divisor=480}
    }" 

为什么需要房产?
您需要某种方式来传递谓词,以便转换器可以为您过滤列表。
In WPF can you filter a CollectionViewSource without code behind?

你甚至可以有一个谓词列表。
向转换器添加属性的技术非常有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多