WPF中的线程问题

时间:2013-01-30 17:18:42

标签: wpf datagrid observablecollection dispatcher background-thread

您无法绑定到WPF DataGrid's列属性,因此解决方法是使用附加属性in this SO question/answer。我的viewmodel公开了一个包含ObservableCollection的{​​{1}},并通过此附加属性将其绑定到DataGridColumns

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

  

调用线程无法访问此对象,因为另一个线程拥有它。

(在处理添加操作的Dispatcher.Invoke中,特别是行else if)。

知道可能出现什么问题吗?

1 个答案:

答案 0 :(得分:1)

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

否则,您需要确保对集合的所有更改都发生在用户界面线程上。使用Dispatcher.Invoke应该有效(假设您获得了正确的Dispatcher实例),尽管有更优雅的解决方案,例如The Helper Trinity中的绑定集合和其他项目。