WPF中ListView排序实现(2022.12.25有更新)

要实现ListView点击某一列进行排序,需要处理列点击事件

<Window x:Class="ListViewSort.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="300" Width="300" Loaded="Window_Loaded">
    <Grid>
        <ListView GridViewColumnHeader.Click="GridViewColumnHeader_Click" Margin="2" ItemsSource="{Binding Path=DataList}" >
            <ListView.View>
                <GridView>
                    <GridViewColumn  Header="ID" DisplayMemberBinding="{Binding ID}" />
                    <GridViewColumn  Header="Name" DisplayMemberBinding="{Binding Name}" />
                    <GridViewColumn  Width="200">
                          <GridViewColumn.Header>
                                  <GridViewColumnHeader Tag="AppState">State</GridViewColumnHeader>
                          </GridViewColumn.Header>
                          <GridViewColumn.CellTemplate>
							<DataTemplate>
                                <TextBlock  HorizontalAlignment="Left"
											   VerticalAlignment="Center"
											   TextAlignment="Left"
											   Width="Auto"
											   Text="{Binding AppState}"
								MouseEnter="UIElement_OnMouseEnter"/>
							</DataTemplate>
                         </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Window>

下面的代码支持ListView 多个列点击排序,并会记住点击过的每个列的排序方向 。

 private void GridViewColumnHeader_Click(object sender, RoutedEventArgs e) {
            ListView view = sender as ListView;
            if (view == null) {
                return;
            }
            if (e.OriginalSource is GridViewColumnHeader header) {
                //获取点击列
                GridViewColumn clickedColumn = header.Column;
                if (clickedColumn != null) {
                    //获取该列绑定的属性
                    string bindingProperty = (clickedColumn.DisplayMemberBinding as Binding)?.Path.Path;
                    if (bindingProperty == null) {
                        bindingProperty = header.Tag.ToString();
                        if (string.IsNullOrEmpty(bindingProperty)) {
                            return;
                        }
                    }
                    SortDescriptionCollection sdc = view.Items.SortDescriptions;
                    ListSortDirection sortDirection = ListSortDirection.Ascending;
                    foreach (var sd in sdc) {
                        if (sd.PropertyName.Equals(bindingProperty)) {
                            //改变排序方向
                            sortDirection = (ListSortDirection) ((((int) sd.Direction) + 1) % 2);
                            //取得排序方向后,删除当前的SortDescription
                            sdc.Remove(sd);
                            break;
                        }
                    }
                    //添加新的SortDescription到SortDescriptions首位,使之生效
                    sdc.Insert(0,new SortDescription(bindingProperty, sortDirection));
                }
            }
        }

排序是根据列的类型来的,就ID列来说,int类型的排序结果是2,3,17,而如果你把该列
类型改为string,结果就会是17,2,3,如果你定义列的时候不加类型,默认是string,如
果是自定义类型,那么请继承IComparable接口,实现CompareTo方法。  

2022.12.15更新:

原来排序只支持数据直接绑定在DisplayMemberBinding,可以用获取绑定属性, 如果绑定在其它控件时,则可以使用GridViewColumnHeader的Tag属性,来获取绑定属性,  为了减小代码修改,没有统一用Tag属性, 

string bindingProperty = (clickedColumn.DisplayMemberBinding as Binding)?.Path.Path;
                    if (bindingProperty == null) {
                        bindingProperty = header.Tag.ToString();
                        if (string.IsNullOrEmpty(bindingProperty)) {
                            return;
                        }
                    }

参考了下面链接:

How-to: ListView with column sorting - The complete WPF tutorial (wpf-tutorial.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据提供的引用内容,实现WPF HelixToolkit.Wpf.SharpDX前后端点云效果的步骤如下: 1. 首先下载源码https://github.com/helix-toolkit/helix-toolkit,并打开source文件夹的Example/WPF.SharpDX/FileLoadDemo.csproj文件。 2. 在VS打开FileLoadDemo.csproj文件后,需要添加引用。右键Solution Explorer的References,选择Manage Nuget Packages。在Browse搜索Helix3DToolkit.Wpf.SharpDX和SharpDX并安装。 3. 在MainWindow.xaml添加HelixViewport3D控件,用于显示点云效果。 4. 在MainWindow.xaml.cs添加以下代码,用于加载点云数据: ```csharp private void LoadPointCloud() { var reader = new StreamReader("pointcloud.xyz"); var positions = new List<Vector3>(); while (!reader.EndOfStream) { var line = reader.ReadLine(); var values = line.Split(' '); var x = float.Parse(values[0], CultureInfo.InvariantCulture); var y = float.Parse(values[1], CultureInfo.InvariantCulture); var z = float.Parse(values[2], CultureInfo.InvariantCulture); positions.Add(new Vector3(x, y, z)); } reader.Close(); var builder = new MeshBuilder(); builder.AddPointCloud(positions, Colors.Red, 2); var meshGeometry = builder.ToMesh(); var geometryModel = new GeometryModel3D(meshGeometry, Materials.Red); var modelGroup = new Model3DGroup(); modelGroup.Children.Add(geometryModel); var visual3D = new ModelVisual3D(); visual3D.Content = modelGroup; viewport.Children.Add(visual3D); } ``` 该代码将从文件pointcloud.xyz读取点云数据,并将其添加到HelixViewport3D控件。 5. 在MainWindow.xaml.cs的构造函数调用LoadPointCloud()方法,以加载点云数据。 ```csharp public MainWindow() { InitializeComponent(); LoadPointCloud(); } ``` 6. 运行程序,即可在HelixViewport3D控件看到点云效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值