TextBox TextChanged事件问题
本文关键字:问题 事件 TextChanged TextBox | 更新日期: 2023-09-27 18:19:46
我使用的是一个绑定到对象的基本TextBox。基本上,我想做的是在每次编辑框中的文本并且用户取消选择框时或者在编辑底层绑定数据时调用一个方法。我现在使用的是TextChanged事件,但这有一些问题:
-
它是在第一次创建TextBox时调用的,我不希望这样。
-
每次添加新字符时都会调用它,我只希望在底层绑定数据发生更改时(似乎是焦点从框中转移时)调用它。
我怎样才能做到这一点?
编辑:我试过其他几个TextBox属性,比如Get/LossFocus,但它们似乎永远不会启动。
此外,我不想把这个方法调用放在属性的Setter中,因为底层数据在逻辑上与这个项目的UI是分开的,我不想要任何与为UI进行计算有关的方法调用。
当焦点从当前元素转移时,事件LostFocus
会触发。我试过了,效果很好。
视图:
<TextBox x:Name="TextBox1" Text="{Binding Path=Text1,Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/>
ViewModel:
public string Text1
{
get { return _text1; }
set
{
_text1 = value;
RaisePropertyChanged("Text1");
}
}
查看代码背后:
private void ViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Text1")
{
//Call UI related method...
}
}
通过这种方式,它满足您的两个条件:1.每次编辑TextBox并失去焦点时,都会调用Text1的Setter,ViewModel会引发PropertyChanged事件。2.当基础Text1发生更改时。Text1还将引发事件,以便View可以知道它。
它还可以避免您的两个担忧:1.在第一次绑定时,只调用Text1的getter。没有引发任何事件。2.只有在TextBox失去焦点后才调用Text1的Setter。
每当编辑框中的文本并且用户取消选择框时
嗯,AFAIK,如果你像这样绑定文本,这是TextBox的标准行为:Text={Binding Property}
当基础绑定数据被编辑时
您可以在属性的setter中提供此功能。
最好的设计是监听底层绑定属性的更改。如果使用DependencyProperty或对象实现INotifyPropertyChanged,则可以在不更改setter的情况下执行此操作。
当基础属性发生更改时(默认情况下为LostFocus,或一次更改每个字符)是一个绑定选项。
如果你不想听从我的建议,在(视图-)模型中列出更改,你可以订阅GotFocus和LostFocus事件。当你获得焦点时保存当前值,当你失去焦点时与当前值进行比较。如果不同->做你想做的事情。
我不确定你最终想要实现什么,但我要对此进行猜测。如果您遵循MVVM模式,那么似乎可以通过使用绑定的updateSourceTrigger属性来实现您想要的。如果您没有使用MVVM,那么您可能会考虑使用MVVM