在WPF中使用代码解除绑定

62

我想在显示文本框中的数据时使用数据绑定。 我基本上像这样做:

 public void ShowRandomObject(IRandomObject randomObject) {
        Binding binding = new Binding {Source = randomObject, Path = new PropertyPath("Name")};
        txtName.SetBinding(TextBox.TextProperty, binding);
    }

我似乎找不到取消绑定的方法。我会使用许多不同的对象调用此方法,但TextBox将保持不变。是否有办法删除先前的绑定,还是在设置新绑定时会自动完成?

4个回答

95

替代方法:

BindingOperations.ClearBinding(txtName, TextBox.TextProperty)

1
Visual Basic无法解析.SetBinding(..., Nothing)调用,因为两个签名都采用引用类型(一个字符串和一个BindingBase)。我更喜欢这种方式。 - Bob King
4
在Silverlight 3中,ClearBinding方法不存在。参考链接:https://dev59.com/W3I-5IYBdhLWcg3w3cg8 - Aaron Hoffman
@BobKing将其(Nothing)转换为所需的类型。 - ANeves

51

可用时

BindingOperations.ClearBinding(txtName, TextBox.TextProperty)

对于较旧的SilverLight版本,但根据评论所述不可靠:

txtName.SetBinding(TextBox.TextProperty, null);

启用了C# 6.0功能

this.btnFinish.ClearBinding(ButtonBase.CommandProperty);

我怀疑在设置新绑定时之前的绑定已被删除,因为我找不到关于如何执行此操作的任何信息。谢谢! - Robert Höglund
3
这个不起作用。SetBinding 函数有多个重载,当第二个参数传入 null 时会导致调用变得模糊不清。 - Simon Fox
2
@Simon,当调用不明确时,您可以将null值转换为所需的类型以解决歧义;) 例如:(Binding)null - Pop Catalin
2
@Pop,你是对的,那样做是可行的,但是Ed在下面提供的方法是由框架提供的,显然更可取。 - Simon Fox
4
使用这个解决方案时,我会遇到一个 ArgumentNullException 异常(但显然并非总是如此)。 - Marcel Gosselin
Ed的解决方案更加可靠。我也遇到了ArgumentNullException。 - Alireza

19

如何呢:

this.ClearValue(TextBox.TextProperty);

我认为这样更清洁 ;)


3
这种方法的文档说明不是很清晰,读起来好像只会清除值,而非绑定。但在实际使用中,它似乎能够起作用。 - Aaron Hoffman
6
BindingOperations.ClearBinding() 调用此方法。 - Aaron Hoffman

0
怎么只是这样呢
txtName.Text = txtName.Text;

无论如何您都必须在清除后设置该值。至少在SL4中可以这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接