通过派生GridViewColumnHeader对ListView进行排序

时间:2010-10-19 15:43:40

标签: wpf gridview listview jquery-ui-sortable

我正在尝试使用带有可排序列的GridView实现ListView。 为了对ListView进行排序,我将GridViewColumnHeaders的Click事件连接起来,并将SortDescriptors添加到默认视图源(类似于MSDN中所做的)。

这样的事情:

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

这一切都很好,但我想稍微概括一下。为此,我只是派生了GridViewColumnHeader并编写了一个click-handler。我知道有许多可排序的列表视图实现通常来自ListView,但我只是想知道这种方法是否可行。

这样的事情:

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

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

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

我将如何在代码中执行此操作? (我一直在寻找关于如何对WPF ListView进行排序的答案,我想知道是否可以这样做)。

修改

原来我需要的是我的GridViewColumnHeader衍生物的click-handler中的这个父搜索器。

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

现在我的排序就像一个魅力。

1 个答案:

答案 0 :(得分:2)

使用附加属性有一种更简单的方法。查看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>