【问题标题】:Special Sorting ListView when clicking header单击标题时的特殊排序ListView
【发布时间】:2017-05-05 06:07:05
【问题描述】:

我得到了这样的一行:

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

【问题讨论】:

标签: c# wpf xaml


【解决方案1】:

由于您已经检查了@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));
        }
    }
}

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

【讨论】:

  • @JulPod 这很有趣......所以你有静态项目还是什么?对于大多数实际的 MVVM 案例,您将拥有一个 ItemsSource
  • 是的,我添加了这样的项目:items.add(),我想我必须重新考虑我的绑定代码,似乎更容易过滤等等......
  • @JulPod 如果您不使用ItemsSource,您也可以尝试在我的答案中有cvs.SortDescriptions 的地方使用ListViewAnlagen.Items.SortDescriptions。可能有效(目前无法测试)
  • 刚刚测试,不工作,列表视图只是空了,但不在乎,我只是用xmldataprovider绑定它们,现在它工作了,所以还是谢谢
  • @JulPod 顺便说一句:我刚刚测试了ListViewAnlagen.Items.SortDescriptions 方法,它对我有用 - 没有空项目。所以也许有其他东西干扰了你的代码。
猜你喜欢
  • 2010-11-02
  • 1970-01-01
  • 2015-08-27
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
相关资源
最近更新 更多