列单击时WPF ListView排序

use*_*992 6 .net c# wpf listview

我有一个listview,项目在运行时以单个/多个列的网格形式添加.现在我需要让排序工作.列表视图中包含项目并单击列后,应对该列进行排序.

以下是listview的代码

<ListView Name="lstValue" Margin="0,0,0,10"></ListView>
Run Code Online (Sandbox Code Playgroud)

填充列表视图的C#代码:

 case "Person":
                        dt = GetDataTable(GET_Person)
                        this.lstValue.View = gridview;
                        gridview.Columns.Add(new GridViewColumn { Header = "Number", 
                            DisplayMemberBinding = new Binding("Number") });
                        gridview.Columns.Add(new GridViewColumn { Header = "Name", 
                            DisplayMemberBinding = new Binding("Name") });
                        foreach(DataRow dr in dt.Rows)
                        {
                                                          this.lstValue.Items.Add(new ReportItem { Number = dr["Number"].ToString(),
                                Name = dr["Name"].ToString() });
                        }
                        break;
Run Code Online (Sandbox Code Playgroud)

他们应该能够对姓名或号码进行排序.

Liz*_*Liz 9

链接是MSDN方式.主要是处理gridview列标题上的单击.

<ListView x:Name='lv' Height="150" HorizontalAlignment="Center" 
  VerticalAlignment="Center" 
  GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler"
 >
Run Code Online (Sandbox Code Playgroud)

并在代码中:

GridViewColumnHeader _lastHeaderClicked = null;
ListSortDirection _lastDirection = ListSortDirection.Ascending;

void GridViewColumnHeaderClickedHandler(object sender,RoutedEventArgs e)
{
  GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader;
  ListSortDirection direction;

  if (headerClicked != null)
  {
      if (headerClicked.Role != GridViewColumnHeaderRole.Padding)
      {
          if (headerClicked != _lastHeaderClicked)
          {
             direction = ListSortDirection.Ascending;
          }
          else
          {
             if (_lastDirection == ListSortDirection.Ascending)
             {
               direction = ListSortDirection.Descending;
             }
             else
             {
                 direction = ListSortDirection.Ascending;
             }
          }

          string header = headerClicked.Column.Header as string;
          Sort(header, direction);

          _lastHeaderClicked = headerClicked;
          _lastDirection = direction;
       }
    }
  }

 private void Sort(string sortBy, ListSortDirection direction)
 {
  ICollectionView dataView =
    CollectionViewSource.GetDefaultView(lv.ItemsSource);

  dataView.SortDescriptions.Clear();
  SortDescription sd = new SortDescription(sortBy, direction);
  dataView.SortDescriptions.Add(sd);
  dataView.Refresh();
Run Code Online (Sandbox Code Playgroud)

}

基本上就是这样.我没有在列标题中添加小方向字形来显示方向.如果您想了解如何操作,可以参考完整的教程(参见上面的链接).

  • 哦对不起,我没有考虑到你没有使用ItemsSource属性的事实.在你的情况下,将"CollectionViewSource ...."的东西更改为lstValue.Items,它应该可以工作. (2认同)