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();
    }
4

3 回答 3

1

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

于 2016-03-01T17:23:52.943 回答
0

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

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

确保通过传统的TwoWay或编译的TwoWayText立即对 a 的属性进行更改的正确方法是设置.TextBox {Binding} {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()不再是确定 aDependencyProperty是否已配置的可靠机制,或者DependencyProperty在运行时获取 a 的绑定语句。

我知道一个标准控件 ( NumberBox) 不能正确支持UpdateSourceTrigger=PropertyChanged,但是由于您无法确定是否已使用编译绑定来绑定属性,因此需要使用其他解决方案来影响我们期望的更改,请参阅此帖子以获取解决方案NumberBox

于 2020-10-02T01:37:29.617 回答
0

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

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

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

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

于 2016-03-02T05:03:36.417 回答