Compiled Bindings x:Bind 是在设计时执行以生成代码以注册事件处理程序并显式设置相关属性的指令,绕过在运行时使用反射的{Binding} 注册,因此在运行时无法从x:Bind 检测或获取绑定语句的句柄,因为没有。
正如@Jayden 部分解释的那样,在您的特定情况下根本不需要获取绑定,因为当文本更改时不需要手动/显式调用更新绑定,这样做是违反直觉并导致意想不到的结果。
确保对TextBox 的Text 属性的即时更改通过传统的TwoWay {Binding} 或已编译的TwoWay 提交回的正确方法{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()不再是确定DependencyProperty 是否已配置或在运行时获取DependencyProperty 的绑定语句的可靠机制。
我知道 一个 标准控件 (NumberBox) 不能正确支持 UpdateSourceTrigger=PropertyChanged,但是由于您无法确定是否使用了已编译的绑定要绑定属性,需要使用其他解决方案来影响我们预期的更改,see this post for solutions to NumberBox