Сортиране на WPF мрежа с данни с цяло число, добавено с низ

Имам wpf datagrid. Присвоявам му 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 колони в datagrid, които имат огромни данни. И има хиляди записи в мрежата с данни. Времето, необходимо за зареждане на datagrid, вече е огромно. Ако добавим друго int свойство, това ще намали производителността. Моля, поправете ме, ако греша - person senthilraja; 26.03.2014
comment
@senthilraja Това конкретно свойство няма да забави мрежата по никакъв осезаем начин, но ще получите малък удар всеки път, когато трябва да зададете това свойство. Ако можете малко да денормализирате данните си и тази int стойност да е предварително изчислена в базата данни, ще получите най-добрата производителност за нея. - person slugster; 27.03.2014
comment
@senthilraja Също така се уверете, че използвате мрежа с включена виртуализация (така че UI елементите се генерират само за това, което е видимо и това, което е точно извън прозореца за изглед). Трябва да можете да обвържете буквално милиони записи към мрежа - но може да има неща, за които трябва да внимавате, като грешки при обвързване, интензивно използване на конвертори, прекалено широки редове с данни и т.н. - person slugster; 27.03.2014
comment
тествах с огромните си данни. работи. благодаря Слъгстър. - person senthilraja; 31.03.2014