Сетка данных WPF, привязанная к коллекции ObservableCollection, которая обновляется в отдельном потоке, не поддерживает сортировку - PullRequest
3 голосов
/ 27 февраля 2011

Скачать пример проекта

У меня есть таблица данных wpf 4, связанная с ObservableCollection.Эта коллекция ObservableCollection обновляется в другом потоке.Я могу видеть обновления, поступающие на мой простой графический интерфейс, просто отлично.Я даже могу отсортировать данные.Но сортировка не "прилипает".Он будет отсортирован один раз, когда вы щелкнете по заголовку столбца, но когда значение в коллекции изменится, сортировка не изменится соответственно.

Код поддержки MainWindow - это то место, где большинство действий прекращается (просто для простоты примера).Я создаю ObservableCollection и передаю его потоку, который выполняет фактическую запись в ObservableCollection.Затем я связываю ту же ObservableCollection с сеткой данных через CollectionView (я также пытался связать ее напрямую).Я догадываюсь, что сортировка зависит от события collectionChanged, которое, я уверен, не вызовет Dispatcher (см .: http://bea.stollnitz.com/blog/?p=34).

Что делать?

    public partial class MainWindow : Window
{
    private Thread _dataThread;
    private Thread _marketThread;
    private SampleData _sampleData;
    private Market _market;
    private ObservableCollection<Stock> stocks;
    private ConcurrentQueue<Stock> _updates = new ConcurrentQueue<Stock>();
    public MainWindow()
    {
        InitializeComponent();

        stocks = new ObservableCollection<Stock>();

        for (var i = 0; i < 5; i++)
        {
            var newStock = new Stock();
            newStock.Id = (uint)i;
            stocks.Add(newStock);
        }

        var source = CollectionViewSource.GetDefaultView(stocks);

        dataGrid.ItemsSource = source;
        _sampleData = new SampleData(_updates);
        _dataThread = new Thread(_sampleData.CreateData) { Name = "Data Thread" };
        _dataThread.Start();

        _market = new Market(_updates, stocks);
        _marketThread = new Thread(_market.Start){Name = "Market Thread"};
        _marketThread.Start();

    }

}

Challenge.

Загрузить пример проекта

1 Ответ

0 голосов
/ 23 июля 2011

Вы смотрели на ObjectDataProvider IsAsynchonous = "True" и связывались в XAML? Вы можете не создавать поток создания коллекции. У меня нет опыта, как сортировки DataGrid ведут себя за IsAsynchonous = "True".

    <ObjectDataProvider IsAsynchonous="True" ...>
...