UWP使用GetBindingExpression和x:Bind进行数据绑定

4

我正在将我的UWP应用程序从Binding重写为x:Bind。我有不同文本框的TextChanged事件。使用Binding,我可以使用GetBindingExpression来更新模型。是否有一个等效的方法来使用x:Bind?或者如何使用x:Bind实现这一点?

    public void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        var binding = ((TextBox)sender).GetBindingExpression(TextBox.TextProperty);
        binding.UpdateSource();
    }
3个回答

1

0
FrameworkElement.GetBindingExpression方法返回包含有关Binding的单个实例的信息的BindingExpression。因此,它只能在绑定中使用。根据您发布的代码,看起来您想在文本更改时使用x:Bind更新源。在绑定中,我们可以将UpdateSourceTrigger设置为PropertyChanged来实现此目的:
<TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="200" Margin="5" />

但是对于 x:Bind,没有 UpdateSourceTrigger 属性,它只在失去焦点时触发。因此,我建议您在这种情况下继续使用 Binding。


这条建议在2020年几乎正确,但容易引起误解。我不确定此处描述的问题何时得到修复,即使它是一个错误。 - Chris Schaller

0

编译绑定x:Bind是在设计时执行的指令,用于生成代码以注册事件处理程序并显式设置相关属性,绕过了在运行时使用反射进行注册的{Binding}注册,因此在运行时无法检测或获取来自x:Bind的绑定语句的句柄,因为根本没有。

正如@Jayden部分解释的那样,在您的特定情况下根本不需要获取绑定,因为在文本更改时不需要手动/显式调用绑定的更新,这样做是违反直觉的,并导致意外结果。

确保将TextBoxText属性的即时更改通过传统的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的解决方案


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