【问题标题】:Does databinding always marshal to the UI thread?数据绑定是否总是编组到 UI 线程?
【发布时间】:2011-06-08 09:05:42
【问题描述】:

当绑定到 Silverlight 3 和 4 中的属性时,Windows Phone 7 版本的 silverlight 以及 WPF 3.5 和 4 中的属性更改通知是否总是编组到 UI 线程?您是否知道我不能依赖它并且必须在我的代码中进行编组的任何情况?

【问题讨论】:

    标签: wpf multithreading silverlight data-binding ui-thread


    【解决方案1】:

    是的,收藏。当您绑定到可观察集合并从非 UI 线程更改它时,您将收到异常。您必须将集合更改编组到 UI 线程。

    【讨论】:

    • 您能否确认除了集合之外,我在上述所有框架中都是安全的?
    • 我可以肯定地说只适用于 WPF。尚未与 Silverlight 核对。
    【解决方案2】:

    我做了一些实验……

    1. INotifyPropertyChanged
      如果您从后台线程更改属性,并从该后台线程触发 INotifyPropertyChanged,并且该属性是数据绑定的,那么...

      • WPF:它可以工作(即数据绑定器将其编组到 UI 线程)
      • Silverlight5 和 WinRT:失败(即数据绑定器不编组)
      • 电话:我认为它与 Silverlight 相同,但没有尝试过。
    2. 依赖属性
      如果属性是依赖属性而不是 INotifyPropertyChanged 怎么办?如果您从后台线程更改此属性怎么办?好吧,我没有做过任何实验,但我读到它没有做任何编组。

    3. INotifyCollectionChanged(例如 ObservableCollection)
      如果您从后台线程添加/删除 ObservableCollection 中的元素,并且该集合被数据绑定到列表框或类似的,那么会发生什么?

      • WPF:从 WPF4.5 开始,您可以使用 BindingOperations.EnableCollectionSynchronization(collection, new object());它会正确编组。但是,在 WPF4.5 之前,就像 Pavlo 所说的那样。
      • Silverlight,WinRT:再次和 Pavol 说的一样。

    【讨论】:

      猜你喜欢
      • 2010-10-08
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      相关资源
      最近更新 更多