Compiled Bindingsx:Bind
是在设计时执行以生成代码以注册事件处理程序并显式设置相关属性的指令,绕过{Binding}
在运行时使用反射的注册,因此在运行时无法检测或获取绑定语句的句柄从一个,x:Bind
因为没有。
正如@Jayden部分解释的那样,在您的特定情况下根本不需要获取绑定,因为在文本更改时不需要手动/显式调用更新绑定,这样做是反直觉的并且会导致到意想不到的结果。
确保通过传统的TwoWay或编译的TwoWayText
立即对 a 的属性进行更改的正确方法是设置.TextBox
{Binding}
{x:Bind}
UpdateSourceTrigger=PropertyChanged
在 UWP 中,两者都{Binding}
支持{X:Bind}
UpdatteSourceTrigger ,但是{X:Bind}
具有有限选项的更简单实现,但是两者都支持PropertyChanged
以下两种方法都可以:
<TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Width="200"
Margin="5" />
<TextBox Text="{x:Bind VM.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Width="200"
Margin="5" />
您手动更新绑定的唯一时间是您的绑定语句UpdateSourceTrigger
已将Explicit
.
您不应该尝试手动更新绑定的原因是因为它会与绑定语句冲突,特别是如果绑定被故意设置为UpdateSourceTrigger=LostFocus
. 在这种情况下,您的事件处理程序仍将更新文本更改的绑定,当这成为未来开发人员的问题时,他们不会考虑寻找对文本更改事件的显式处理
作为迁移到已编译绑定x:Bind
并确认它们可用于任何绑定的一部分,您应该仔细检查GetBindingExpression()
代码中的所有调用并尝试消除它们,因为GetBindingExpression()
不再是确定 aDependencyProperty
是否已配置的可靠机制,或者DependencyProperty
在运行时获取 a 的绑定语句。
我知道一个标准控件 ( NumberBox
) 不能正确支持UpdateSourceTrigger=PropertyChanged
,但是由于您无法确定是否已使用编译绑定来绑定属性,因此需要使用其他解决方案来影响我们期望的更改,请参阅此帖子以获取解决方案NumberBox