代码之家  ›  专栏  ›  技术社区  ›  Holstebroe

通过派生GridViewColumnHeader对ListView排序

  •  1
  • Holstebroe  · 技术社区  · 15 年前

    我正在尝试实现一个带有可排序列的网格视图的ListView。 要对ListView进行排序,我挂接GridViewColumnHeaders的Click事件,并将SortDescriptor添加到默认视图源(类似于 MSDN )

    像这样:

    <ListView ItemsSource="MY ITEMS SOURCE BINDING">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn DisplayMemberBinding="MY DISPLAYMEMBER  BINDING">
                        <GridViewColumnHeader Content="My Header" Click="ColumnHeaderClicked"/>
    

    这一切都很好,但我想概括一下。为此,我简单地派生了GridViewColumnHeader并编写了一个单击处理程序。我知道有许多可排序的列表视图实现通常是从ListView派生的,但我只是想知道这种方法是否可行。

    像这样:

    <ListView ItemsSource="MY ITEMS SOURCE BINDING">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn DisplayMemberBinding="MY DISPLAYMEMBER  BINDING">
                        <local:SortableGridViewColumnHeader Content="My Header"/>
    

    为此,我需要从SortableGridViewColumnHeader代码导航到包含ListView,以便设置新的SortDescriptor。

    我尝试在父级阶梯上导航,但GridViewColumnHeader不是我的ListView的可见子级。当然,我可以创建一个依赖属性并将其绑定到ListView,但是必须有一种方法来导航到它。

    我该如何在代码中做到这一点?(我不是在寻找如何对WPF列表视图进行排序的答案,我想知道是否可以这样做)。

    编辑

    结果发现我需要的是在我的GridViewColumnHeader派生的点击处理程序中的父搜索者。

    DependencyObject parent = this;
    do
    {
        parent = VisualTreeHelper.GetParent(parent);
        if (parent == null) return;
    } while (!(parent is ListView));
    

    现在我的分类工作很有魅力。

    1 回复  |  直到 10 年前
        1
  •  2
  •   Thomas Levesque    10 年前

    有一种更简单的方法可以做到这一点,即使用附加属性。退房 this article 详情。

    <ListView ItemsSource="{Binding Persons}"
          IsSynchronizedWithCurrentItem="True"
          util:GridViewSort.AutoSort="True">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Header="Name"
                                    DisplayMemberBinding="{Binding Name}"
                                    util:GridViewSort.PropertyName="Name"/>
                    <GridViewColumn Header="First name"
                                    DisplayMemberBinding="{Binding FirstName}"
                                    util:GridViewSort.PropertyName="FirstName"/>
                    <GridViewColumn Header="Date of birth"
                                    DisplayMemberBinding="{Binding DateOfBirth}"
                                    util:GridViewSort.PropertyName="DateOfBirth"/>
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>
    
    推荐文章