我正在尝试使用带有可排序列的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));
现在我的排序就像一个魅力。
答案 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>