我被迫使用第三方控件来屏蔽文本输入。第三方控件的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属性,有时则不会将其设置为文本。
我怀疑Binding的UpdateSourceTrigger。我应该将其更改为其他内容吗?在UpdateSourceTrigger和事件本身之间的这种情况下的顺序是什么?该订单是否可预测,即它是否总是以该顺序发生?
答案 0 :(得分:1)
我假设您在调用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;
}