2015-01-08 3 views
0

Я хочу, чтобы столбец в моем DataGrid сортировал нулевые значения всегда в конце. Я попытался сделать это, следуя this (part 1) и this (part 2). Но мой пользовательский вид не работает, как я хочу.Sort DataGridColumn с нулевыми значениями всегда внизу

Вот мой метод для сравнения моей колонки:

private int NullableDateTimeCompare(DateTime? date1, DateTime? date2, int direction) 
{ 
    if (date1.HasValue && date2.HasValue) 
     return DateTime.Compare(date1.Value, date2.Value)*direction; 
    if (!date1.HasValue && !date2.HasValue) 
     return 0; 
    if (date1.HasValue) 
     return 1 * -direction; // Tried different things but nothing work like I will 
    return -1 * -direction; // Tried different things but nothing work like I will 
} 

Я впечатление, что это не работает, потому что DataGrid кэшируется Сравните результат и так инвертировать сортировку, когда пользователь сортировать (и не работают в другой раз Compare).

У вас есть идея, как это сделать?

Спасибо!

+2

Если вы всегда хотите, чтобы нули внизу, то сравнение между нулевым значением и ненулевым значением не должно зависеть от направления. – juharr

ответ

0

Я делал простой проект, чтобы поделиться с вами, чтобы объяснить мою проблему. И я нашел решение.

Это как @juharr ответ, но наоборот.

if (date1.HasValue) 
    return -1; 
return 1; 

Не знаю, почему это должно быть так, но оно работает. Нули всегда на дне.

Так спасибо @juharr!

+0

Является 'date1' первым аргументом метода' IComparer.Compare', а 'date2' - вторым. Если вы их поменяли, это объяснит, почему вы должны сделать обратный. – juharr

+0

Я не меняю их. Вот почему я нахожу это странным. – Floc

1

Как вы код в настоящее время стоит следующий будет возвращать 1

NullableDateTimeCompare(DateTime.Now, null, -1); 
NullableDateTimeCompare(null, DateTime.Now, 1); 

И это вернет -1

NullableDateTimeCompare(DateTime.Now, null, 1); 
NullableDateTimeCompare(null, DateTime.Now, -1); 

Но то, что вы хотите для них, чтобы вернуть 1

NullableDateTimeCompare(DateTime.Now, null, -1); 
NullableDateTimeCompare(DateTime.Now, null, 1); 

, и они возвращаются -1

NullableDateTimeCompare(null, DateTime.Now, 1); 
NullableDateTimeCompare(null, DateTime.Now, -1); 

Для достижения этой цели просто возвращает 1 или -1 в конце функции

if (date1.HasValue) 
    return 1; 
return -1; 
+0

Я пробовал это сначала, но это не сработало. Поэтому я думаю, что при восхождении нулевой должен получить высокий балл, а спуск должен иметь низкий балл. Но это тоже не сработало ... – Floc

+0

Нули должны получить низкий или -1, если вы хотите их в конце, независимо от восходящего или нисходящего, что я и предполагал, что вы хотели. – juharr

+0

Хорошо, но это не сработает. Попробуйте сами и посмотрите. Вы можете загрузить пример проекта из ссылки, которую я дал в описании. – Floc