【问题标题】:UWP Using GetBindingExpression with x:BindUWP 使用 GetBindingExpression 和 x:Bind
【发布时间】:2016-03-01 15:25:39
【问题描述】:

我正在将我的 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();
    }

【问题讨论】:

    标签: c# xaml binding win-universal-app xbind


    【解决方案1】:

    我之前尝试过这样做,但没有成功。我认为现在不可用,因为 Bind 它只是一个标记扩展。 这是文档和示例如何使用它 https://msdn.microsoft.com/en-us/library/windows/apps/mt204783.aspx

    【讨论】:

      【解决方案2】:

      FrameworkElement.GetBindingExpression 方法返回 BindingExpression,其中包含有关 Binding 的单个实例的信息。

      所以这只能在Binding中使用。根据您发布的代码,您似乎想在文本更改时使用 x:Bind 来更新源。在 Binding 中,我们可以将 UpdateSourceTrigger 设置为 PropertyChanged 来做到这一点:

      <TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="200" Margin="5" />
      

      但是 x:Bind 没有 UpdateSourceTrigger 属性,它只会在失去焦点时触发。所以我建议你在这种情况下继续使用 Binding。

      【讨论】:

      • 这个建议几乎是正确的,但在 2020 年具有误导性,我不确定这里描述的问题何时得到修复,即使它是一个错误。
      【解决方案3】:

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

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

      确保对TextBoxText 属性的即时更改通过传统的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

      【讨论】:

        猜你喜欢
        • 2016-03-05
        • 1970-01-01
        • 1970-01-01
        • 2018-10-21
        • 2018-05-27
        • 2020-08-05
        • 1970-01-01
        • 2018-09-02
        • 2020-10-25
        相关资源
        最近更新 更多