【问题标题】:WPF Datagrid, sort on autogenerated column containing IP AddressWPF Datagrid,对包含 IP 地址的自动生成的列进行排序
【发布时间】:2016-09-08 09:43:57
【问题描述】:

使用以下代码时,IP 地址列不可排序(单击标题时没有任何反应且未触发排序事件)。如何使 IP 地址列可排序?

C#:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Net;
using System.Windows;
using System.Windows.Controls;

namespace DGrid1
{
    public class Item
    {
        public IPAddress Address { get; set; }
        public string Name { get; set; }
    }

    public partial class MainWindow : Window
    {
        public ObservableCollection<Item> Collection { get; set; }
        public MainWindow()
        {
            Collection = new ObservableCollection<Item>();
            Collection.Add(new Item {Address=IPAddress.Parse("192.168.201.123"), Name="fred" });
            Collection.Add(new Item { Address = IPAddress.Parse("192.168.201.241"), Name = "jim" });
            InitializeComponent();
            this.DataContext = this;
        }

        private void grid_Sorting(object sender, DataGridSortingEventArgs e)
        {
            System.Diagnostics.Debug.WriteLine(e.Column);
        }
    }
}

XAML:

<Window x:Class="DGrid1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid ItemsSource="{Binding Collection}" AutoGenerateColumns="True" x:Name="grid" Sorting="grid_Sorting"/>
    </Grid>
</Window>

谢谢

【问题讨论】:

    标签: c# wpf sorting datagrid


    【解决方案1】:

    尝试使用以下语法在 DataGrid 的 XAML 中手动定义每一列:

    <DataGrid ItemsSource="{Binding Collection}" AutoGenerateColumns="False" x:Name="grid" Sorting="grid_Sorting">
        <DataGrid.Columns>
            <DataGridTextColumn Header="IP" Binding="{Binding Address}" SortMemberPath="Address" />
            <DataGridTextColumn Header="Name" Binding="{Binding Name}" SortMemberPath="Name" />
        </DataGrid.Columns>
    </DataGrid>
    

    【讨论】:

    • 谢谢。这行得通,但是为什么在自动生成列时对 IP 地址禁用排序?
    • 这不是真的可排序的:看看我的答案,我选择了一个可排序的属性并保留原始的自动生成
    • @AdrianS 因为 .NET 不知道如何对您的类 Item 进行排序,因此当自动生成列时,WPF 不知道如何为 Address 属性生成可排序的列。当您手动编写 DataGridTextColumn 标记时,您指定属性地址。
    猜你喜欢
    • 2014-03-12
    • 2014-10-29
    • 2014-06-06
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2016-03-04
    • 1970-01-01
    相关资源
    最近更新 更多