WPF中的线程问题

WPF中的线程问题,wpf,datagrid,observablecollection,dispatcher,background-thread,Wpf,Datagrid,Observablecollection,Dispatcher,Background Thread,您无法绑定到WPFDataGrid的Columns属性,因此解决方法是使用找到的附加属性。我的viewmodel公开了一个包含DataGridColumns的ObservableCollection,我通过这个附加属性将其绑定到DataGrid 后台线程负责填充集合,我使用的是Dispatcher.Invoke,我认为这样可以避免线程问题。后台线程本身工作正常,但在上面附加的属性代码中引发了一个异常: 调用线程无法访问此对象,因为其他线程拥有它 (在处理添加操作的else if中,特别是行dat

您无法绑定到WPF
DataGrid的
Columns属性,因此解决方法是使用找到的附加属性。我的viewmodel公开了一个包含
DataGridColumns
ObservableCollection
,我通过这个附加属性将其绑定到
DataGrid

后台线程负责填充集合,我使用的是
Dispatcher.Invoke
,我认为这样可以避免线程问题。后台线程本身工作正常,但在上面附加的属性代码中引发了一个异常:

调用线程无法访问此对象,因为其他线程拥有它

(在处理添加操作的
else if
中,特别是行
dataGrid.Columns.Add(column);


你知道哪里不对吗?

如果你使用的是.NET 4.5,最简单的选择就是使用。这允许您直接在后台线程上更新集合,而不必担心绑定中的同步


否则,您需要确保对集合的所有更改都发生在用户界面线程上。使用
Dispatcher.Invoke
应该可以工作(前提是您获得了正确的
Dispatcher
实例),不过还有更优雅的解决方案,例如中的绑定集合和其他项目。

请查看此问题:您能否在后台构建ObservableCollection。但是在主(UI)线程上添加列?@Blam我不确定我是否遵循。ObservableCollection是我的列集合。我使用的是MVVM,这个附加属性是在运行时绑定列的唯一方法(我不知道在设计时需要哪些列,所以无法在XAML中创建它们)。后台线程执行许多任务—检索数据、填充要绑定到网格行的集合以及填充列集合。作为最后的手段,我可以将最后一步从后台线程移到UI线程中。创建一打项目并不保证它在后台线程中。如果创建一打项目不保证它在后台线程中,那么为什么这是一个“最后手段”。你不懂哪一部分?我用的是4.0。我想我使用的是正确的Dispatcher实例。如果我在代码中放置断点并查看Dispatcher的Thread.ManagedThreadID,它与主线程的ID相同。同样,当引发异常时,Thread窗口显示为在主线程中。不确定我还能检查什么来确认我在所有的线程上都是正确的。@AndrewStephens确保你的集合和绑定也是在主UI线程上创建的…标记为answer,因为它几乎就在那里,并激励我找到问题!尽管我使用Dispatcher.Invoke将我的DataGridColumn对象添加到ObservableCollection,但我并没有使用Dispatcher创建它们,也就是说,它们被后台线程“拥有”——因此出现了异常消息。