【问题标题】:Sorting a ListView by deriving GridViewColumnHeader通过派生 GridViewColumnHeader 对 ListView 进行排序
【发布时间】:2010-10-19 15:43:39
【问题描述】:

我正在尝试使用带有可排序列的 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 并编写了一个点击处理程序。我知道有很多可排序的列表视图实现通常源自 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 ListViews 进行一般排序的答案,我想知道是否可以这样做)。

编辑

事实证明,我需要的是我的 GridViewColumnHeader 衍生产品的点击处理程序中的这个父搜索器。

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

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

【问题讨论】:

    标签: wpf gridview listview jquery-ui-sortable


    【解决方案1】:

    有一种更简单的方法可以做到这一点,即使用附加属性。详情请查看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>
    

    【讨论】:

    • 我不同意这更容易。附加的属性代码比我的简单派生类复杂得多。附加属性肯定会增加许多好处,但并不那么简单。我的问题与其说是关于排序,不如说是如何导航到包含的 ListView。我可以看到您引用的代码使用 VisualTreeHelper.GetParent。我实际上在询问之前尝试过这个,但失败了(这就是我问的原因)。也许这只是我祖先搜索中的一个错误。
    • “附加的属性代码比我的简单派生类复杂得多”:是的。但我并不是说它很容易编码,我是说它很容易使用,恕我直言,这更重要;)。关于您查找 ListView 的问题:可能是因为当您尝试导航可视化树时尚未加载 GridViewColumnHeader...尝试在 Loaded 事件中执行此操作
    • GridViewSort 代码确实是一种鼓舞人心的方法,但对我来说并不比简单的点击处理程序更容易使用。我需要修改 GridViewSort 代码以满足我的需要,因为我的一些列应该在多个属性上进行排序。乱用第三方源代码可能很危险。
    • @GAPS:它是一个XML命名空间,你需要在根元素中声明它:xmlns:util="clr-namespace:TheNameSpace;assembly=TheAssembly"
    猜你喜欢
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2014-10-17
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多