WPF数据表格绑定到一个ObservableCollection,该集合在单独的线程上更新,无法保持排序。

3

下载示例项目

我有一个绑定到ObservableCollection的WPF 4数据表格。这个ObservableCollection在另一个线程上更新。我可以看到更新正常地传递到我的简单GUI中。我甚至可以对数据进行排序。但是排序不会“保持”。当集合中的值更改时,它仅会在单击列标题时进行一次排序,而排序不会相应地更改。

大部分操作都在MainWindow后备代码中进行(仅为简化示例)。我创建了一个ObservableCollection并将其传递给执行实际写入操作的线程。然后,通过CollectionView将同一ObservableCollection绑定到数据表格上(我也尝试过直接绑定)。我的直觉是,排序取决于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();

    }

}

挑战。

下载示例项目

1个回答

0
你看过在XAML中绑定IsAsynchronous="True"的ObjectDataProvider吗?这样可能无需对集合创建进行线程处理。我不知道DataGrid在IsAsynchronous="True"背后的排序行为。
    <ObjectDataProvider IsAsynchonous="True" ...>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接