如何在FrameworkElementFactory中实现TabItem Header与TextBox的正确绑定
问题原因
你当前绑定没有配置双向同步规则,TextBox.Text 默认绑定逻辑不会主动回写源属性:
HeaderTemplate的数据上下文就是TabItem.Header的值,你绑定路径为.时直接指向该字符串值,但字符串为不可变类型,且未指定双向绑定模式,修改TextBox内容不会回写到Header属性。- 未显式指定
UpdateSourceTrigger,默认的LostFocus同步逻辑也可能和你的预期不符。
修复方案
仅需要修改你绑定TextBox.TextProperty的代码即可:
// 替换原来的 textBoxFactory.SetBinding(TextBox.TextProperty, new Binding(".")); textBoxFactory.SetBinding(TextBox.TextProperty, new Binding(".") { Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged // 如果需要失焦再同步可改为UpdateSourceTrigger.LostFocus });
如果想要绑定更稳定,也可以直接绑定到父级TabItem的Header属性,避免数据上下文变化带来的问题:
textBoxFactory.SetBinding(TextBox.TextProperty, new Binding("Header") { RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(TabItem), 1), Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
修改后重新运行,修改TextBox内容后双击TabItem即可弹出更新后的Header值。
额外建议
当前你用的FrameworkElementFactory已被官方标记为弃用类型,更推荐把HeaderTemplate写在XAML资源中,后台直接调用资源即可,模板维护成本更低。
内容的提问来源于stack exchange,提问作者Noob001
相关产品推荐
相关产品推荐

