调用DataTemplate.LoadContent()设置DataContext后如何立即解析绑定
问题原因
WPF的绑定更新默认会加入到UI调度器Dispatcher的队列中,执行优先级为DispatcherPriority.DataBind,低于普通代码的执行优先级。设置DataContext后立刻查看控件属性时,绑定更新任务仍在队列中等待调度,因此会拿到空值。之前尝试的方法无效,一是因为UpdateTarget是BindingExpression类的方法,直接对控件调用不生效;二是绑定未完成初始化时,调用InvalidateProperty无法触发绑定刷新。
解决方案
两种方案均可实现绑定立即解析,按需选择即可:
方法1:强制调度器处理绑定优先级任务
该方案通用性更强,模板内存在多个绑定时,一次调用即可完成全部绑定刷新:
var model = new Model(); var template = FindResource("MyDataTemplate") as DataTemplate; var textBlock = template.LoadContent() as TextBlock; textBlock.DataContext = model; // 新增这行强制处理所有排队的绑定任务 Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.DataBind, new Action(delegate { })); // 此处textBlock.Text已经为"TheDataValue"
方法2:手动触发单个绑定更新
适合仅需要刷新单个属性绑定的场景:
var model = new Model(); var template = FindResource("MyDataTemplate") as DataTemplate; var textBlock = template.LoadContent() as TextBlock; textBlock.DataContext = model; // 新增这两行手动触发指定属性的绑定更新 var bindingExp = textBlock.GetBindingExpression(TextBlock.TextProperty); bindingExp?.UpdateTarget(); // 此处textBlock.Text已经为"TheDataValue"
内容的提问来源于stack exchange,提问作者PatrickV
相关产品推荐
相关产品推荐

