单击标题时的特殊排序ListView

时间:2017-05-05 06:07:05

标签: c# wpf xaml

我有这样的一行:

enter image description here

XAML:

<ListView x:Name="ListViewAnlagen"
          Grid.RowSpan="2"
          ItemContainerStyle="{StaticResource TempContainerStyle}"
          VerticalAlignment="Top" HorizontalAlignment="Left"
          Height="571" Width="1314"
          Margin="0,53,0,0"
          AlternationCount="2"
          GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler">
    <ListView.View>
        <GridView ColumnHeaderContainerStyle="{DynamicResource CustomHeaderStyle}">
            <GridView.Columns>
                <GridViewColumn Width="100">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Border x:Name="border"
                                    BorderBrush="Gray" BorderThickness=".5" Margin="-6,-3">
                                <TextBlock Text="{Binding EqNr}" Margin="6,3"/>
                            </Border>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="EQ Nr."/>
                        <Image Source="img/filter.png"
                               Width="20" Height="20" Margin="25 0 0 0"
                               MouseDown="Image_MouseDown_1" />
                    </StackPanel>
                </GridViewColumn>

我添加了一个点击处理程序:GridViewColumnHeader.Click

我的问题是,如何对这个升序和降序进行排序。我已经查看了其他一些解决方案,但它们似乎只有在用DisplayMemberBinding绑定它时才有效。

我已经尝试过: this

1 个答案:

答案 0 :(得分:2)

由于您已经检查了@AmolBavannavar(https://code.msdn.microsoft.com/windowsdesktop/Sorting-a-WPF-ListView-by-209a7d45)评论的示例,因此这是示例与您当前方法之间的混合。

调整示例的主要障碍是使用GridViewColumnHeader.CommandGridViewColumnHeader.CommandParameter。您对该命令的等效项是GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler",但您仍需要等效于命令参数。

我建议你为此创建一个附加的字符串属性,并使用它将排序属性名称附加到GridViewColumn。为了演示,我不创建新属性,而是滥用TextSearch.TextPath附加属性:

<GridViewColumn Width="100" TextSearch.TextPath="EqNr">

请注意,"EqNr"与稍后在单元格模板中用于绑定的属性名称相同。

现在,所有内容都在点击处理程序中使用。

  • 获取点击的列标题
  • 获取关联列
  • 获取包含排序属性名称
  • 的附加属性值
  • 获取与项目来源(或项目)相关联的集合视图
  • 更改集合视图的排序说明

简化排序逻辑的代码:

private void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e)
{
    var h = e.OriginalSource as GridViewColumnHeader;
    if (h != null)
    {
        var propertyName = h.Column.GetValue(TextSearch.TextPathProperty) as string;
        var cvs = ListViewAnlagen.ItemsSource as ICollectionView ??
            CollectionViewSource.GetDefaultView(ListViewAnlagen.ItemsSource) ??
            ListViewAnlagen.Items;
        if (cvs != null)
        {
            cvs.SortDescriptions.Clear();
            cvs.SortDescriptions.Add(new SortDescription(propertyName, ListSortDirection.Descending));
        }
    }
}

请注意,为了演示,我只清除排序说明并添加静态降序排序说明。对于您的实际应用程序,您可能希望跟踪(或分析)列的当前排序状态,然后在升序和降序排序之间切换。