2010-10-19 83 views
1

我试图用可排序列的GridView实现ListView。 若要对ListView进行排序,请勾选GridViewColumnHeaders的Click事件并将SortDescriptors添加到默认视图源(类似于MSDN中所做的操作)。通过派生GridViewColumnHeader对列表视图进行排序

事情是这样的:

<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)); 

现在我的分类工作就像一个魅力。

回答

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> 
+0

我不同意这样会容易得多。附加的属性代码比我的简单派生类复杂得多。附加的属性肯定会增加一些好处,但并不那么简单。我的问题不是关于如何导航到包含ListView的排序。我可以看到你引用的代码使用VisualTreeHelper.GetParent。我在询问之前实际尝试过,但失败了(这就是我问的原因)。也许这只是我的祖先搜索中的一个错误。 – Holstebroe 2010-10-19 18:48:43

+0

“附加的属性代码比我的简单派生类复杂得多”:是的,它是。但我并不是说这很容易编码,我说它很容易使用,这是更重要的恕我直言;)。关于查找ListView的问题:也许这是因为当您尝试导航可视化树时,GridViewColumnHeader尚未加载......尝试在Loaded事件中执行此操作 – 2010-10-19 21:56:15

+0

GridViewSort代码确实是一种鼓舞人心的方法,但并不便于使用对我来说不是一个简单的点击处理程我需要修改GridViewSort代码以适合我的需求,因为我的一些列应该在多个属性上排序。乱七八糟的第三方源代码可能是危险的。 – Holstebroe 2010-10-20 07:14:07