РЕДАКТИРОВАТЬ: я использую VS2008, .NET 3.5
У меня есть DataTable, который заполняется в DataView и передается в CollectionView.
DataTable newLeadTable = new DataTable();
myConnection.Open();
dbAdpater.Fill(newLeadTable);
this.LeadDataView = new DataView(newLeadTable);
this.LeadsCollectionView =
CollectionViewSource.GetDefaultView(this.LeadDataView);
Тогда DataGrid, который используется для отображения данных, привязывается к this.LeadsCollectionView
После того, как пользователь введет текст фильтра в View, ViewModel выполнит этот метод для установки строки фильтра в DataView:
private void SetLeadListFilter(string LeadFilterStr)
{
this.LeadDataView.RowFilter = filterString;
}
Работает нормально, я вижу, что DataGrid показывает правильно отфильтрованный DataRow.
Но тогда я хочу дать некоторый интерфейс, добавить индикатор занятости.
Поэтому я поместил приведенный выше код в поток:
this.IsBusy = true;
Thread filterDataThread= new Thread(new ThreadStart(() =>
{
this.LeadDataView.RowFilter = filterString;
this.IsBusy = false;
}));
filterDataThread.Start();
Теперь странно, я вижу, что код был запущен, фильтр был установлен. Но DataGrid не фильтрует строки!
Итак, теперь я изменяю метод, переназначаю DataView в CollectionView снова:
this.IsBusy = true;
Thread filterDataThread= new Thread(new ThreadStart(() =>
{
this.LeadDataView.RowFilter = filterString;
this.LeadsCollectionView = CollectionViewSource.GetDefaultView(this.LeadDataView); //Added this
this.IsBusy = false;
}));
filterDataThread.Start();
Теперь это работает! Данные корректно фильтруются в DataGrid!
Так почему же это происходит, когда я использую многопоточность? Это правильный способ использовать DataFilter в Threading?