Сортировать сетку данных WPF с целым числом, добавленным строкой

У меня есть сетка данных wpf. Я назначаю ему ObservableCollection.

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

Если я сортирую, используя этот столбец, он принимает строку по возрастанию, как показано ниже (чего я не хочу)

1_A_B
10_A3_B
12_A1_B
15_A5_B
2_A4_B
3_A2_B

Я хочу отсортировать, используя первое целочисленное значение в столбце выше


person senthilraja    schedule 26.03.2014    source источник
comment
Вы AutoGenerateColumns? Можете ли вы добавить еще один столбец для просмотра модели строки, которая даст вам первую часть этого значения как int?   -  person dkozl    schedule 26.03.2014
comment
я использую AutoGenerateColumns=false. я не хочу добавлять новый столбец в datagrid или ObservableCollection‹T›.   -  person senthilraja    schedule 26.03.2014


Ответы (1)


Значения 1_A_B, 12_A1_B и т. д. будут содержаться в свойстве, привязанном к этому столбцу. Назовем это PropertyA.

Возможно, самый простой способ добиться этого — иметь другое свойство объекта данных, назовем его YourSortOrder. Когда установщик для PropertyA вызывается с ненулевым значением, вы можете использовать простые манипуляции со строками вместе с int.Parse(), чтобы извлечь числовое значение и присвоить его YourSortOrder.

Этот код не является производственным качеством, но иллюстрирует суть:

public string PropertyA
{
    get { ... }
    set
    {
        _propertyA = value;
        if (value != null)
            YourSortOrder = int.Parse(value.Substring(0, value.IndexOf("_", StringComparison.InvariantCultureIgnoreCase)));
    }
}

затем установите SortMemberPath вашего DataGridColumn в свойство YourSortOrder:

<DataGridColumn x:Name="xxxxx"
                SortMemberPath="YourSortOrder" 
                ...etc...
person slugster    schedule 26.03.2014
comment
Я уже думал об этой идее. Проблема, которую я подозреваю, заключается в производительности. У меня есть 6 столбцов в сетке данных с огромными данными. И в сетке данных есть тысячи записей. Время, затрачиваемое на загрузку сетки данных, уже огромно. Если мы добавим еще одно свойство int, это снизит производительность. Пожалуйста, поправьте меня, если я ошибаюсь - person senthilraja; 26.03.2014
comment
@senthilraja Это конкретное свойство не замедлит сетку каким-либо заметным образом, но вы будете получать крошечный удар каждый раз, когда вам нужно установить это свойство. Если бы вы могли немного денормализовать свои данные и предварительно вычислить это значение int в базе данных, вы бы получили для него наилучшую производительность. - person slugster; 27.03.2014
comment
@senthilraja Также убедитесь, что вы используете сетку с включенной виртуализацией (чтобы элементы пользовательского интерфейса генерировались только для того, что видно и что находится за пределами области просмотра). Вы должны быть в состоянии привязать буквально миллионы записей к сетке, но могут быть вещи, на которые вам нужно обратить внимание, такие как ошибки привязки, интенсивное использование конвертеров, чрезмерно широкие строки данных и т. д. - person slugster; 27.03.2014
comment
я тестировал с моими огромными данными. оно работает. спасибо Слагстер. - person senthilraja; 31.03.2014