编译绑定x:Bind
是在设计时执行的指令,用于生成代码以注册事件处理程序并显式设置相关属性,绕过了在运行时使用反射进行注册的{Binding}
注册,因此在运行时无法检测或获取来自x:Bind
的绑定语句的句柄,因为根本没有。
正如@Jayden部分解释的那样,在您的特定情况下根本不需要获取绑定,因为在文本更改时不需要手动/显式调用绑定的更新,这样做是违反直觉的,并导致意外结果。
确保将TextBox
的Text
属性的即时更改通过传统的TwoWay{Binding}
或编译的TwoWay{x:Bind}
提交回来的正确方法是设置UpdateSourceTrigger=PropertyChanged
。
在 UWP 中,
{Binding}
和
{X:Bind}
都支持
UpdateSourceTrigger,但是
{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
,但是由于您无法确定是否已使用编译绑定来绑定其他属性,因此需要使用其他解决方案来实现我们期望的更改,请参阅此帖子以获取有关NumberBox
的解决方案。