我正在尝试使用datagrid SortMemberPath="COLUMN"
属性对列进行排序,我得到一个奇怪的排序顺序:
看起来列是根据数字的第一个数字而不是整个数字排序的。我该如何解决这个问题?
编辑:
好的,我知道问题是什么。我现在正在使用这个转换器,但仍然没有变化。
public class IntToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is string)
{
string s = (string)value;
int num;
if (int.TryParse(s, out num))
return Int32.Parse(s);
}
return DependencyProperty.UnsetValue;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
int number = (int)value;
return number.ToString();
}
}
我将此添加到我的xaml文件Windows.Resource:
<me:IntToStringConverter x:Key="IntToStringConverter"/>
并在我的数据部分进行了此更改:
<toolkit:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding MinRun, Converter={StaticResource IntToStringConverter}}" HorizontalAlignment="Center" />
</DataTemplate>
</toolkit:DataGridTemplateColumn.CellTemplate>
这是XAML的DataGrid部分。请注意,在所有列中,我首先尝试首先正确排序'MinRun'列,然后我将在其他列上使用相同的技术。
答案 0 :(得分:2)
您的列可能绑定到String
对象。
因此,排序执行字母作业,而不是数字。
您应该将列绑定到int
值。
答案 1 :(得分:2)
看起来它正在进行字符串排序,这向我建议您将该列绑定到String属性。将属性更改为整数类型,DataGrid将正确排序。
根据我的经验,程序员将属性设置为字符串类型,因为他们希望在值无效时显示空字符串。请使用ValueConverter,因此您可以灵活地显示所需的任何字符串,同时WPF对基础数据进行数字排序。
答案 2 :(得分:0)
<强>鉴于
DataGrid显示TestResults的集合,其中经过的时间在模型中转换为字符串。绑定到DataGrid时,按字符串排序,而不是数值。
下面显示的解决方案:var qry
是自定义类型的List
,其属性TestElapsedTime
的类型为Double
。
向DataGrid添加排序事件处理程序
<DataGrid x:Name="testResultsDataGrid" Sorting="OnSorting">
在EventHandler
中 private void OnSorting(object sender, DataGridSortingEventArgs e)
{
var col = e.Column.Header.ToString();
if (col == "Elapsed Time")
{
var qry = GetCollectionViewSourceDefaultView();
qry.Sort((x, y) =>
{
var diff = x.TestElapsedTime - y.TestElapsedTime;
return (int)diff;
});
}
}
<强>问题
经过的时间是一个双倍,因此lambda必须执行强制转换为int,如图所示。
<强>惊奇
排序的方向由显示的数据网格决定,它知道如何使用一个排序函数对两个方向进行排序!
答案 3 :(得分:-2)
幸运的是,我可以改变原来的课程,但我对答案感兴趣。
我添加了一个只读整数属性。