Сортировка ICollectionView.SortDescriptions не работает, если в базовом DataTable нет строк.

У нас есть приложение WPF с DataGrid внутри ListView.

private DataTable table_;

Мы делаем групповую или динамическую генерацию столбца (в зависимости от отчета, который мы показываем)

Затем мы делаем запрос и заполняем DataTable построчно, этот запрос может иметь или не иметь данные (это не проблема, ожидается пустая сетка). Мы устанавливаем ItemsSource ListView в DefaultView DataTable.

lv.ItemsSource = table_.DefaultView;

Затем мы (смотря на использование приложения пользователем, устанавливаем сортировку в столбце) Метод сортировки ниже:

private void Sort(string sortBy, ListSortDirection direction)
{
 ICollectionView dataView = CollectionViewSource.GetDefaultView(lv.ItemsSource);

 dataView.SortDescriptions.Clear();

 var sd = new SortDescription(sortBy, direction);

 dataView.SortDescriptions.Add(sd);

 dataView.Refresh();
}

В сценарии Zero DataTable rows сортировка не «держится»? и если мы динамически добавляем строки, они не будут отсортированы.

Если в DataTable есть хотя бы 1 строка при применении сортировки, и мы динамически добавляем строки в DataTable, строки отсортированы правильно.

Я создал отдельное приложение, которое копирует это...

Это раздражает, и я могу добавить проверку, чтобы увидеть, была ли DataTable пустой, и повторно применить сортировку...

Кто-нибудь знает, что здесь происходит, и я делаю что-то не так?

К вашему сведению. На основании этого мы взяли данные из MSDN: http://msdn.microsoft.com/en-us/library/ms745786.aspx

Обновление:

сортировка не «удерживает» означает, что ICollectionView.SortDescriptions имеет SortDescription, но не сортирует данные по мере их добавления, опять же, только если в базовой DataTable нет строк, если есть строки при добавлении SortDescription, тогда все отлично получается~


person BigBlondeViking    schedule 30.04.2010    source источник
comment
Что вы подразумеваете под «сортировка не выполняется?»?   -  person xtofl    schedule 03.05.2010


Ответы (1)


Очевидно, это ошибка графического интерфейса. Было бы неплохо обойти это на уровне графического интерфейса, а не на уровне данных. Вот одно предложение.

DataTable table_ = new DataSet1().DataTable1;
ICollectionView dv_;

public MainWindow()
{
    InitializeComponent();

    dv_ = CollectionViewSource.GetDefaultView(table_);
    dv_.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(dv_CollectionChanged);

    lv.ItemsSource = dv_;
}
void dv_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{

    if (e.Action == NotifyCollectionChangedAction.Add && table_.Rows.Count == 1 )
        dv_.Refresh();
}
person jyoung    schedule 05.05.2010