我有一个绑定到ObservableCollection的wpf 4数据网格。这个ObservableCollection是 在另一个线程上更新。我可以看到更新到我的简单gui就好了。我甚至可以对数据进行排序。但那种并不“坚持”。单击列标题时它将排序一次,但当集合中的值发生更改时,排序不会相应更改。
MainWindow支持代码是大部分操作失败的地方(仅为了简化示例)。我创建一个ObservableCollection并将其传递给一个线程,该线程执行对ObservableCollection的实际写入。然后我通过CollectionView将相同的ObservableCollection绑定到datagrid(我也试过直接绑定它)。我的预感是排序取决于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();
}
}
挑战。
答案 0 :(得分:0)
您是否看过ObjectDataProvider IsAsynchonous =“True”并在XAML中绑定?您可能无法对集合创建进行线程化。我没有经验,DataGrid排序如何在IsAsynchonous =“True”之后表现。
<ObjectDataProvider IsAsynchonous="True" ...>