数据绑定是否总是转发到UI线程?

3
在Silverlight 3和4版本以及WPF 3.5和4版本中绑定属性时,Windows Phone 7版本的Silverlight是否始终将属性更改通知转发到UI线程?您是否知道任何无法依赖于此并且需要在代码中执行转发的场景?
2个回答

7

我进行了一些实验...

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

    • WPF:它可以工作(即数据绑定器将其调度到UI线程)
    • Silverlight5和WinRT:它会失败(即数据绑定器不会调度)
    • 手机:我认为与Silverlight相同,但尚未尝试。
       
  2. DependencyProperty
    如果该属性是依赖属性而不是INotifyPropertyChanged呢?如果您从后台线程更改此属性会怎样?好吧,我没有做任何实验,但我读到它不会执行任何调度。

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

    • WPF:自WPF4.5以来,您可以使用BindingOperations.EnableCollectionSynchronization(collection, new object()); 然后它将正确地调度。 但是,在WPF4.5之前,就像Pavlo所说的那样。
    • Silverlight,WinRT:与Pavol所说的一样。
       

2

是的,集合。当您将数据绑定到一个可观察的集合并且您在非UI线程中更改它时,会抛出异常。您需要将集合更改调度到UI线程。


除了集合之外,您能确认在上述所有框架中我都是安全的吗? - bitbonk
我只能确定针对WPF。还没有检查过Silverlight。 - Pavlo Glazkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接