数据绑定是否始终编组到 UI 线程?

发布于 2024-10-11 15:35:37 字数 135 浏览 5 评论 0原文

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

When binding to a property in Silverlight 3 and 4, the Windows Phone 7 version silverlight and in WPF 3.5 and 4 will property change notifications always be marshalled to the UI thread? Are you aware of any scenario where I can not rely on that and would have to do the marshalling in my code?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

稀香 2024-10-18 15:35:37

我做了一些实验...

  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 所说的相同。
       

I did some experiments...

  1. INotifyPropertyChanged
    If you make a change to a property from a background thread, and it fires INotifyPropertyChanged from that background thread, and the property is databound, then...

    • WPF: it works (i.e. the databinder marshals it to the UI thread)
    • Silverlight5 and WinRT: it fails (i.e. the databinder doesn't marshal)
    • Phone: I assume it's the same as Silverlight, but haven't tried.
       
  2. DependencyProperty
    What if the property is a dependency property rather than INotifyPropertyChanged? What if you alter this property from a background thread? Well, I haven't done any experiments, but I read that it doesn't do any marshalling.

  3. INotifyCollectionChanged (e.g. ObservableCollection)
    If you add/remove elements in an ObservableCollection from a background thread, and the collection is databound to a listbox or similar, then what happens?

    • WPF: As of WPF4.5, you can use BindingOperations.EnableCollectionSynchronization(collection, new object()); and it will marshal correctly. However, prior to WPF4.5, it's as Pavlo said.
    • Silverlight, WinRT: again the same as Pavol said.
       
雨后彩虹 2024-10-18 15:35:37

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

Yes, collections. When you bind to an observable collection and you change it from a non-UI thread you will get an exception. You will have to marshal the collection change to the UI thread.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文