【问题标题】:Thread problems in WPFWPF 中的线程问题
【发布时间】:2013-01-14 14:47:27
【问题描述】:

您无法绑定到 WPF DataGrid's Columns 属性,因此解决方法是使用 in this SO question/answer 中的附加属性。我的视图模型公开了一个包含DataGridColumnsObservableCollection,我通过这个附加属性将它绑定到DataGrid

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

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

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

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

【问题讨论】:

  • 你能在后台构建 ObservableCollection。但是然后在主(UI)线程上添加列?
  • @Blam 不确定我是否关注。 ObservableCollection 我的列集合。我正在使用 MVVM,这个附加属性是在运行时绑定列的唯一方法(我不知道设计时需要哪些列,因此无法在 XAML 中创建它们)。后台线程执行许多任务——检索数据、填充集合以绑定到网格行以及填充列集合。作为最后的手段,我可​​以将这最后一步移出后台线程并进入 UI 线程。创建十几个项目并不保证它在后台线程中。
  • 如果创建十几个项目不能保证在后台线程上,那么为什么它是“最后的手段”。你不关注哪一部分?

标签: wpf datagrid observablecollection dispatcher background-thread


【解决方案1】:

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

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

【讨论】:

  • 我使用的是 4.0.我想我正在使用正确的 Dispatcher 实例。如果我在代码中设置断点,并查看 Dispatcher 的 Thread.ManagedThreadID,它与主线程的 ID 相同。同样,当引发异常时,线程窗口显示为在主线程中。不知道我还能检查什么来确认我在所有地方都在正确的线程上。
  • @AndrewStephens 确保您的集合和绑定也是在主 UI 线程上创建...
  • 标记为答案,因为它几乎就在那里,并激励我找到问题!虽然我使用 Dispatcher.Invoke 将我的 DataGridColumn 对象添加到 ObservableCollection,但我并没有使用 Dispatcher创建它们,即它们由后台线程“拥有” - 因此出现异常消息。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多