【发布时间】:2019-09-10 21:35:28
【问题描述】:
我正在开发一个 UWP 应用程序,我意识到 TextBox 控件的默认 UpdateSourceTrigger 模式,即 LostFocus,在使用编译绑定时无法更改。
这意味着每当我想要为 TextBox 更新绑定时,我都必须使用所有这些重复的样板:
<TextBox
Text="{x:Bind ViewModel.Title, Mode=TwoWay}"
TextChanged="TextBox_OnTextChanged"/>
private void TextBox_OnTextChanged(object sender, TextChangedEventArgs e)
{
ViewModel.Title = ((TextBox)sender).Text;
}
现在,这还不算太糟糕,但必须记住每次使用 TextBox 时都创建 TextChanged 处理程序很烦人且容易出错。
这适用于经典绑定:
<TextBox Text="{Binding Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
当然,这里会有 usinc 经典绑定的额外开销(涉及运行时反射等)。
有没有办法获得与UpdateSourceTrigger=PropertyChanged 相同的行为?例如,我完全可以编写一个自定义附加属性来进行设置,只要我可以直接从 XAML 完成我需要的一切,而不涉及任何代码。
谢谢!
更新: (回应 Nico Zhu - MSFT 的回答)
对于我的测试,它运行良好。
这根本不适合我,正如我已经多次说过的那样,将UpdateSourceTrigger 与x:Bind 一起使用只是不可能。它无法编译,该属性在 XAML 编辑器中显示为红色,只是不存在。如果您说它对您有用,我真的不知道您在哪里尝试。我目前的最低目标是 17763,我可以 100% 保证这不有效。
编译绑定与 {x:Bind} 语法一起使用,而不是经典绑定的 {Binding} 语法。
我很清楚其中的区别,我已经多次提到这一点,无论是在我的原始问题中(也包含代码 sn-ps)以及在我的 cmets 中。
它仍然使用通知接口(如 INotifyPropertyChanged)来监视更改
正如我所说,我也知道这一点。但同样,从这个问题来看,这根本不是问题所在。问题是不是从视图模型更新到绑定属性,但从绑定属性(在这种情况下为TextBox.Text)到视图模型。
{x:Bind}默认是 OneTime,而 {Binding} 是 OneWay。所以你需要为 {x:Bind} 声明绑定模式 OneWay 或 TwoWay。
很抱歉,但我不得不说,此时我开始怀疑您是否真的阅读了我最初的问题。我知道这一点,实际上您可以在 both 我的原始代码 sn-ps 中看到我已经在两个绑定中使用了显式 Mode=TwoWay 属性。
再一次,这不是问题的意义所在。
重申:这里的问题是TextBox.Text 属性默认为LostFocus 触发器,并且UpdateSourceTrigger 属性不可可用于编译绑定。所以我想知道是否有一种方法可以通过编译绑定,仅在 XAML 中实现相同的目标,而不必每次都手动创建 TextChanged 处理程序(如果没有,如果您打算最终添加UpdateSourceTrigger 属性也编译绑定)。
旁注:我不是故意在这里听起来不尊重,我希望我们现在已经解决了我的问题存在的误解。
更新 #2: 原来问题是由 ReSharper 插件引起的,该插件将 UpdateSourceTrigger 属性标记为编译绑定中的错误。
我在这里打开了一个问题:https://youtrack.jetbrains.com/issue/RSRP-474438
【问题讨论】:
标签: c# xaml uwp windows-10-universal