如果从工作线程(非UI)更新属性值,它是否会反映在使用数据绑定和侦听属性更改的控件中?
感谢您的关注。
答案 0 :(得分:8)
WPF正在使用Dispatcher,因此一切都在一个UI线程上运行,但是具有交换机类型并发性。当你更新一些依赖对象的prop时,它实际上将一个新的作业发布到调度程序队列上。当该作业运行时,它将在UI线程上运行并正确更新控件。 但是,如果您尝试直接从后台线程访问控件,您将获得异常。
由于此实现,存在某些边缘情况。例如。即使您更新了UI线程上的prop,也不能指望控件会自动同步更新它以反映您的更改。所以,如果你有这样的xaml:
<TextBox x:name="tb" Text="{Binding Text"}/>
这样的代码:
var model = new { Text = "aaa" };
tb.DataContext = model;
model.Text = "bbb";
Debug.Assert(tb.Text == "bbb");
断言可能会失败,因为更新可能会在下一个任务中通过调度程序进行。在当前调用结束并将控制权返回给调度员之前,它不会被更新。
答案 1 :(得分:0)
是的,它会。事实上,使用WPF数据绑定的一个主要优点是可以更简单地实现这种确切的场景。