UWP:替换数据绑定

Sam*_*Sam 2 c# data-binding uwp windows-10-universal

我有一个非常奇怪的问题。如果我设置了绑定并将绑定更改为另一个属性,它将不起作用。

看这个简单的例子

lblTotal.SetBinding(TextBlock.TextProperty, new Binding() { Path = new PropertyPath("Subtotal"), Source = Order, Mode = BindingMode.OneWay });
lblTotal.SetBinding(TextBlock.TextProperty, new Binding() { Path = new PropertyPath("FinalTotal"), Source = Order, Mode = BindingMode.OneWay });
Run Code Online (Sandbox Code Playgroud)

FinalTotal改变时, lblTotal 文本不会改变。

现在,注释掉第一行。

//lblTotal.SetBinding(TextBlock.TextProperty, new Binding() { Path = new PropertyPath("Subtotal"), Source = Order, Mode = BindingMode.OneWay });
lblTotal.SetBinding(TextBlock.TextProperty, new Binding() { Path = new PropertyPath("FinalTotal"), Source = Order, Mode = BindingMode.OneWay });
Run Code Online (Sandbox Code Playgroud)

现在它起作用了!!!!更改FinalTotal将更改 lblTotal 文本!知道为什么吗?

此外,BindingOperations.ClearBinding()在 UWP 中不可用。所以我试图用空绑定替换它,但它仍然不起作用。

lblTotal.SetBinding(TextBlock.TextProperty, new Binding() { Path = new PropertyPath("Subtotal"), Source = Order, Mode = BindingMode.OneWay });

//remove binding - not sure if this is correct way to remove binding because
//BindingOperations.ClearBinding() isn't available in UWP!
BindingOperations.SetBinding(lblTotal, TextBlock.TextProperty, new Binding());

lblTotal.SetBinding(TextBlock.TextProperty, new Binding() { Path = new PropertyPath("FinalTotal"), Source = Order, Mode = BindingMode.OneWay });
Run Code Online (Sandbox Code Playgroud)

我的问题是: 1. 如何更换UWP中的绑定?2. 如何移除 UWP 中现有的绑定(即等效于BindingOperations.ClearBinding() 的功能)?

谢谢你的帮助...

Jay*_*Zuo 6

正如它在FrameworkElement.SetBinding 方法中声明的那样:

注意 调用SetBinding方法并传入新的Binding对象不一定会删除现有绑定。相反,您应该首先调用DependencyObject.ClearValue方法,然后调用SetBinding

所以你可以改变你的代码,如下所示:

lblTotal.SetBinding(TextBlock.TextProperty, new Binding() { Path = new PropertyPath("Subtotal"), Source = Order, Mode = BindingMode.OneWay });
lblTotal.ClearValue(TextBlock.TextProperty);
lblTotal.SetBinding(TextBlock.TextProperty, new Binding() { Path = new PropertyPath("FinalTotal"), Source = Order, Mode = BindingMode.OneWay });
Run Code Online (Sandbox Code Playgroud)

在此之后,您的代码应该能够工作。欲了解更多信息,请参见备注FrameworkElement.SetBindingBindingOperations.SetBinding