如果一个属性的值是从工作线程(非UI)更新的,那么使用数据绑定并监听属性更改的控件是否会反映出来?
感谢您的关注。
感谢您的关注。
WPF 使用 Dispatcher,使得所有工作都在同一个 UI 线程上进行,但是它具有切换类型的并发性。当您更新某个依赖对象的属性时,它实际上会将一个新任务添加到 Dispatcher 队列中。当该任务运行时,它将在 UI 线程上运行,并正确更新控件。
但是如果您尝试从后台线程直接访问控件,则会出现异常。
由于这种实现方式,存在某些边缘情况。例如,即使您在 UI 线程上更新了属性,也不能保证控件会同步地自我更新以反映您的更改。因此,如果您的 XAML 如下所示:
<TextBox x:name="tb" Text="{Binding Text"}/>
而像这样的代码:
var model = new { Text = "aaa" };
tb.DataContext = model;
model.Text = "bbb";
Debug.Assert(tb.Text == "bbb");
断言可能会失败,因为更新可能通过下一个任务中的调度程序进行。在当前调用结束并将控制返回给调度程序之前,不会进行更新。
是的,它会。事实上,使用WPF数据绑定的主要优势之一就是使实现这种情况变得更简单。