我正在开发一个 UWP 应用程序,我意识到控件的默认UpdateSourceTrigger模式是,在使用已编译的绑定时无法更改。TextBoxLostFocus
这意味着每当我想要为 a 更新绑定时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;
}
现在,这还算不错,但是TextChanged每次TextBox使用 a 时都必须记住创建处理程序,这很烦人且容易出错。
这适用于经典绑定:
<TextBox Text="{Binding Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
但是当然,这里会有 usinc 经典绑定的额外开销(涉及运行时反射等)。
有没有办法获得相同的行为UpdateSourceTrigger=PropertyChanged?我完全可以接受,比如说,编写一个自定义附加属性来进行设置,只要我可以直接从 XAML 完成我需要的一切,而不涉及任何代码。
谢谢!
更新:( 回应 Nico Zhu - MSFT 的回答)
对于我的测试,它运行良好。
它根本不适合我,正如我已经多次说过的,使用UpdateSourceTriggerwithx:Bind是不可能的。它不编译,该属性在 XAML 编辑器中显示为红色,只是不存在。如果您说它对您有用,我真的不知道您在哪里尝试。我目前将 17763 作为最低目标,我可以 100% 保证这行不通。
编译绑定与 {x:Bind} 语法一起使用,而不是经典绑定的 {Binding} 语法。
我很清楚其中的区别,我已经多次提到了这一点,无论是在我这里的原始问题(也有代码片段)还是在我的评论中。
它仍然使用通知接口(如 INotifyPropertyChanged)来监视更改
正如我所说,我也知道这一点。但是同样,从这个问题来看,这根本不是这里的问题。问题不在于从视图模型到绑定属性的更新,而是从绑定属性(在本例中为 TextBox.Text)到视图模型的更新。
{x:Bind}默认情况下是 OneTime 与 {Binding} 相比,后者是 OneWay。所以你需要为 {x:Bind} 声明绑定模式 OneWay 或 TwoWay。
抱歉,但此时我不得不说,我开始怀疑您是否真的阅读了我最初的问题。我知道这一点,事实上您可以在我的两个原始代码片段中看到我已经Mode=TwoWay在我的两个绑定中使用了显式属性。
再一次,这根本不是问题所在。
重申一下:这里的问题是该TextBox.Text属性默认为LostFocus触发器,并且该UpdateSourceTrigger属性不可用于已编译的绑定。所以我想知道是否有一种方法可以实现相同的效果,使用编译绑定,仅在 XAML 中,而不必TextChanged每次都手动创建处理程序(如果没有,如果您计划最终将UpdateSourceTrigger属性添加到也编译绑定)。
旁注:我并不是有意在这里表达不敬,我希望我们现在已经解决了我的问题中存在的误解。
更新 #2:原来问题是由 ReSharper 插件引起的,该插件UpdateSourceTrigger在编译绑定中将属性标记为错误。我在这里打开了一个问题:https ://youtrack.jetbrains.com/issue/RSRP-474438
慕工程0101907
森林海
随时随地看视频慕课网APP
相关分类