WPF复制带绑定的TextBox至收藏TabItem,绑定失效求助
解决复制绑定到新TextBox后内容为空的问题
嘿,我瞅了下你的代码,问题核心出在绑定源的错误设置上!你原来的TextBox绑定的是Article.Name,但它的数据源(DataContext)大概率不是当前页面(this)——可能是某个视图模型实例,或者是继承自父元素的DataContext。而你手动给新绑定指定binding.Source = this,如果你的页面类里没有Article属性,绑定自然找不到值,新TextBox就会一直是空的。
正确的修复思路
我们需要复用原绑定的数据源,而不是强行指定Source为页面本身。下面是修正后的代码:
private void FavButton_Click(object sender, MouseButtonEventArgs e) { // [... 保留你创建textbox和label的代码] string BindingName = "TB_DP_ArticleName"; // 替换成你实际获取的原TextBox名称 var originalTB = this.FindName(BindingName) as TextBox; if (originalTB == null) return; // 获取原TextBox的绑定对象 var originalBinding = BindingOperations.GetBinding(originalTB, TextBox.TextProperty); if (originalBinding == null) return; // 复制原绑定的所有关键属性,重点复用数据源 var newBinding = new Binding { Path = originalBinding.Path, Mode = originalBinding.Mode, UpdateSourceTrigger = originalBinding.UpdateSourceTrigger, TargetNullValue = originalBinding.TargetNullValue, // 优先用原绑定的Source,没有的话就用原TextBox的DataContext(继承来的数据源) Source = originalBinding.Source ?? originalTB.DataContext }; // 给新创建的TextBox设置绑定 BindingOperations.SetBinding(tb, TextBox.TextProperty, newBinding); // [... 保留你把TextBox添加到Grid的代码] }
为什么之前的克隆方法无效?
你尝试的绑定克隆方法可能没处理好数据源继承的情况:如果原绑定没有显式设置Source(依赖父元素的DataContext),克隆后的绑定也不会自动继承这个数据源,导致新TextBox找不到Article.Name的路径。上面的代码会优先用原绑定的Source,没有的话就直接取原TextBox的DataContext,完美解决这个问题。
额外简化方案(如果DataContext是继承的)
如果你的整个页面/父容器的DataContext绑定到了一个包含Article属性的ViewModel,那么新TextBox添加到VisualTree后会自动继承这个DataContext,这时候绑定可以更简单:
var newBinding = new Binding(originalBinding.Path.Path) { Mode = originalBinding.Mode, UpdateSourceTrigger = originalBinding.UpdateSourceTrigger, TargetNullValue = originalBinding.TargetNullValue }; BindingOperations.SetBinding(tb, TextBox.TextProperty, newBinding);
这样甚至不需要手动设置Source,因为新TextBox会自动从父元素获取DataContext,和原TextBox的数据源保持一致。
内容的提问来源于stack exchange,提问作者x3Ro
相关产品推荐
相关产品推荐

