我被迫使用第三方控件来屏蔽文本输入。第三方控件的 XAML 如下所示
<thirdParty:MaskInput Value={Binding Path=Phone, UpdateSourceTrigger=LostFocus} x:Name=Phone LostFocus=Phone_LostFocus />
现在在我的代码中,我有一个事件处理程序的代码,如下所示 -
public void Phone_LostFocus(object sender, RoutedEventArgs e) {
((MaskInput)sender).Value = ((MaskInput)e.OriginalSource).Text;
}
当我执行此代码时,有时会设置 Value 属性,有时它不会设置为文本。
我怀疑绑定的 UpdateSourceTrigger。我应该把它改成别的东西吗?在这种情况下,UpdateSourceTrigger 和事件本身之间的顺序是什么?该顺序是否可预测,即 它总是按这个顺序发生吗?
我假设您在调用 LostFocus 事件时需要更改?
你可以在这里做一些事情,因为据我所知,在LostFocus的UpdateSourceTrigger和LostFocus的事件之间,顺序是不可预测的。
1.在不同时间更新源触发器。如果在属性更改时执行此操作,则在调用 LostFocus 事件时,模型已更新。缺点是,如果每次更新模型时都在后台进行大量处理,这将运行缓慢。
<thirdParty:MaskInput Value={Binding Path=Phone, UpdateSourceTrigger=PropertyChanged} LostFocus=Phone_LostFocus/>
2.在 LostFocus 事件中将更改传播到模型,并将绑定保留为 OneWay(从模型到控件)。
<thirdParty:MaskInput Value={Binding Path=Phone, Mode=OneWay}, LostFocus=Phone_LostFocus/>
public void Phone_LostFocus(object sender, RoutedEventArgs e) {
myPhone.Value = ((MaskInput)sender).Text;
//rest of event code here.
}
3.在 LostFocus 事件中使用 MaskInput 值,并且不必担心模型何时会进行更改。
<thirdParty:MaskInput Value={Binding Path=Phone, UpdateSourceTrigger=LostFocus}, LostFocus=Phone_LostFocus/>
public void Phone_LostFocus(object sender, RoutedEventArgs e) {
string currentText = ((MaskInput)sender).Text;
//rest of event using currentText;
}