【问题标题】:WPF DataGrid bound to an ObservableCollection that is updated on separate thread fails to maintain sort绑定到在单独线程上更新的 ObservableCollection 的 WPF DataGrid 无法维护排序
【发布时间】:2011-07-05 03:39:34
【问题描述】:

Download Sample Project

我有一个绑定到 ObservableCollection 的 wpf 4 数据网格。这个 ObservableCollection 是 在另一个线程上更新。我可以看到更新到我的简单 gui 就好了。我什至可以对数据进行排序。但排序不会“坚持”。当您单击列标题时它会排序一次,但当集合中的值更改时,排序不会相应更改。

MainWindow 支持代码是大部分操作失败的地方(只是为了简化示例)。我创建了一个 ObservableCollection 并将其传递给一个线程,该线程对 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();

    }

}

挑战。

Download Sample Project

【问题讨论】:

    标签: wpf sorting datagrid observablecollection dispatcher


    【解决方案1】:

    您是否查看过 ObjectDataProvider IsAsynchonous="True" 并在 XAML 中绑定?您可能无法将集合创建线程化。我没有经验 DataGrid 排序在 IsAsynchonous="True" 后面的行为。

        <ObjectDataProvider IsAsynchonous="True" ...>
    

    【讨论】:

      猜你喜欢
      • 2021-08-31
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 2011-01-07
      • 1970-01-01
      • 2015-01-26
      • 2015-04-02
      相关资源
      最近更新 更多