3

我试图让我的列使用 datagridSortMemberPath="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”列正确排序,然后我将在其他列上使用相同的技术。

http://pastebin.com/ec14p4ks

4

4 回答 4

2

您的列可能绑定到一个String对象。因此,排序是按字母顺序完成的,而不是数字。

您应该将列绑定到int值。

于 2013-04-10T15:13:37.753 回答
2

看起来它正在执行字符串排序,这向我表明您正在将该列绑定到 String 属性。将属性更改为整数类型,DataGrid 将正确排序。

根据我的经验,程序员将属性设为字符串类型是因为他们希望,例如,当值无效时显示空白字符串。为此,请使用 ValueConverter,因此您可以灵活地显示所需的任何字符串,同时 WPF 对基础数据进行数字排序。

于 2013-04-10T15:21:11.450 回答
0

给定

一个 DataGrid 显示一组 TestResults ,其中经过时间在模型中转换为字符串。当绑定到 DataGrid 时,排序是按字符串而不是数值。

解决方案如下所示:var qry是一个List具有 type 属性TestElapsedTime的自定义类型Double

将排序事件处理程序添加到 DataGrid

  <DataGrid x:Name="testResultsDataGrid" Sorting="OnSorting">

在事件处理程序中

    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,如图所示。

惊喜

排序的方向由显示的数据网格决定,它知道如何使用一个排序功能对两个方向进行排序!

于 2016-01-14T00:34:26.017 回答
-2

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

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

于 2015-02-13T15:02:55.547 回答