UWP使用带有x:Bind的GetBindingExpression

时间:2016-03-01 15:25:39

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

我从绑定到x:Bind重写了我的UWP应用程序。我在不同的文本框上有一个TextChanged事件。使用Binding我可以使用GetBindingExpression来更新Model。是否有一个等效的方法x:Bind?或者我怎么能用x:绑定?

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  

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。

答案 2 :(得分:0)

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

正如@Jayden部分解释的那样,在您的特定情况下根本不需要获取绑定,因为在更改文本时不必手动/明确调用绑定上的更新这样反而很直观,并会导致意外的结果。

通过传统的 TwoWay Text或已编译的TextBox的{​​{1}}属性{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