C# 使用附加字符串的整数对WPF datagrid排序

C# 使用附加字符串的整数对WPF datagrid排序,c#,wpf,xaml,sorting,wpfdatagrid,C#,Wpf,Xaml,Sorting,Wpfdatagrid,我有一个wpf数据网格。我给它指定了可观察的集合 DG1.DataContext = a; 其中一列的值如下所示 1_A_B 12_A1_B 3_A2_B 10_A3_B 2_A4_B 15_A5_B 1_A_B 2_A4_B 3_A2_B 10_A3_B 12_A1_B 15_A5_B 我想使用第一个整数值对datagrid进行排序,如下所示 1_A_B 12_A1_B 3_A2_B 10_A3_B 2_A4_B 15_A5_B 1_A_B 2_A4_B 3_A2_B 10_A3_B

我有一个wpf数据网格。我给它指定了可观察的集合

DG1.DataContext = a; 
其中一列的值如下所示

1_A_B
12_A1_B
3_A2_B
10_A3_B
2_A4_B
15_A5_B
1_A_B
2_A4_B
3_A2_B
10_A3_B
12_A1_B
15_A5_B
我想使用第一个整数值对datagrid进行排序,如下所示

1_A_B
12_A1_B
3_A2_B
10_A3_B
2_A4_B
15_A5_B
1_A_B
2_A4_B
3_A2_B
10_A3_B
12_A1_B
15_A5_B
如果我使用此列进行排序,它将作为字符串升序,如下所示(这不是我想要的)


我想使用上述列中的第一个整数值进行排序

1\u A\u B
12\u A1\u B
等将包含在绑定到该列的属性中。让我们将其称为
PropertyA

可能实现这一点的最简单方法是在数据对象上拥有另一个属性,我们称之为
YourSortOrder
。当使用非空值调用
PropertyA
上的setter时,您可以使用简单的字符串操作和来提取数值并将其分配给
YourSortOrder

这段代码不是生产质量,但说明了这一点:

public string PropertyA
{
    get { ... }
    set
    {
        _propertyA = value;
        if (value != null)
            YourSortOrder = int.Parse(value.Substring(0, value.IndexOf("_", StringComparison.InvariantCultureIgnoreCase)));
    }
}
然后将DataGridColumn的
SortMemberPath
设置为属性
YourSortOrder

<DataGridColumn x:Name="xxxxx"
                SortMemberPath="YourSortOrder" 
                ...etc...

1\u A\u B
12\u A1\u B
等将包含在绑定到该列的属性中。让我们将其称为
PropertyA

可能实现这一点的最简单方法是在数据对象上拥有另一个属性,我们称之为
YourSortOrder
。当使用非空值调用
PropertyA
上的setter时,您可以使用简单的字符串操作和来提取数值并将其分配给
YourSortOrder

这段代码不是生产质量,但说明了这一点:

public string PropertyA
{
    get { ... }
    set
    {
        _propertyA = value;
        if (value != null)
            YourSortOrder = int.Parse(value.Substring(0, value.IndexOf("_", StringComparison.InvariantCultureIgnoreCase)));
    }
}
然后将DataGridColumn的
SortMemberPath
设置为属性
YourSortOrder

<DataGridColumn x:Name="xxxxx"
                SortMemberPath="YourSortOrder" 
                ...etc...

您是否
自动生成列
?您可以添加另一个列来查看行的模型,它会将该值的第一部分设置为int吗?我使用AutoGenerateColumns=false。我不想向datagrid或ObservableCollection中添加新列。是否
自动生成列
?您可以添加另一个列来查看行的模型,它会将该值的第一部分设置为int吗?我使用AutoGenerateColumns=false。我不想在datagrid或ObservableCollection中添加新列。我已经想到了这个想法。我怀疑的问题是性能。我在datagrid中有6列,其中包含大量数据。在数据网格中有10万条记录。加载datagrid所需的时间已经很长了。如果我们添加另一个int属性,将降低性能。如果我是,请纠正我wrong@senthilraja这个特殊属性不会以任何明显的方式减慢网格的速度,但是每次需要设置该属性时,您都会受到轻微的影响。如果您可以稍微对数据进行反规范化,并在数据库中预先计算该int值,您将获得最佳性能。@senthilraja还可以确保您使用的网格已启用虚拟化(因此UI元素仅针对可见和视口外的内容生成)。您应该能够将数以百万计的记录绑定到一个网格上,但您可能需要注意绑定错误、大量使用转换器、数据行过宽等问题。我用大量数据进行了测试。它起作用了。谢谢Slugster。我已经想到了这个主意。我怀疑的问题是性能。我在datagrid中有6列,其中包含大量数据。在数据网格中有10万条记录。加载datagrid所需的时间已经很长了。如果我们添加另一个int属性,将降低性能。如果我是,请纠正我wrong@senthilraja这个特殊属性不会以任何明显的方式减慢网格的速度,但是每次需要设置该属性时,您都会受到轻微的影响。如果您可以稍微对数据进行反规范化,并在数据库中预先计算该int值,您将获得最佳性能。@senthilraja还可以确保您使用的网格已启用虚拟化(因此UI元素仅针对可见和视口外的内容生成)。您应该能够将数以百万计的记录绑定到一个网格上,但您可能需要注意绑定错误、大量使用转换器、数据行过宽等问题。我用大量数据进行了测试。它起作用了。谢谢Slugster。