WPF datagrid排序错误

时间:2013-04-10 15:09:27

标签: wpf datagrid

我正在尝试使用datagrid SortMemberPath="COLUMN"属性对列进行排序,我得到一个奇怪的排序顺序:

enter image description here

看起来列是根据数字的第一个数字而不是整个数字排序的。我该如何解决这个问题?

编辑:

好的,我知道问题是什么。我现在正在使用这个转换器,但仍然没有变化。

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'列,然后我将在其他列上使用相同的技术。

http://pastebin.com/ec14p4ks

4 个答案:

答案 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)

幸运的是,我可以改变原来的课程,但我对答案感兴趣。

我添加了一个只读整数属性。