我有一个文本框并且上面有一个onlostfocus事件。
在lostfocus方法中,有没有办法可以确定用户是否实际更改了其中的值? 即如何掌握其中的任何先前价值?
由于
答案 0 :(得分:5)
与WPF中的其他所有内容一样,如果使用数据绑定,这会更容易。
将文本框绑定到类属性。默认情况下,绑定控件失去焦点时绑定会更新源,因此您不必使用LostFocus
事件。然后,您可以访问新值和用户在属性设置器中输入的值。
在XAML中它看起来像这样:
<TextBox Text="{Binding MyProperty, Mode=TwoWay}"/>
在课堂上它看起来像这样:
private string _MyProperty;
public string MyProperty
{
get { return _MyProperty; }
set
{
// at this point, value contains what the user just typed, and
// _MyProperty contains the property's previous value.
if (value != _MyProperty)
{
_MyProperty = value;
// assuming you've implemented INotifyPropertyChanged in the usual way...
OnPropertyChanged("MyProperty");
}
}
答案 1 :(得分:2)
我想到的是一个两阶段的方法。处理文本框中的TextChanged
事件并标记它。然后,当文本框OnLostFocus
出现时,您只需检查您的标记即可查看文本是否已更改。
以下是有关如何处理跟踪的代码段。
public class MyView
{
private bool _textChanged = false;
private String _oldValue = String.Empty;
TextChanged( ... )
{
// The user modifed the text, set our flag
_textChanged = true;
}
OnLostFocus( ... )
{
// Has the text changed?
if( _textChanged )
{
// Do work with _oldValue and the
// current value of the textbox
// Finished work save the new value as old
_oldValue = myTextBox.Text;
// Reset changed flag
_textChanged = false;
}
}
}
答案 2 :(得分:0)
将原始值存储在某处。您可以编写一个公共组件来在焦点获得焦点时存储该值,并在失去焦点时比较该值。我在ASP.NET中完成了这项工作并且运行良好。
答案 3 :(得分:0)
通过数据绑定解决此问题的另一种方法:
将TextBox.Text绑定到属性,该属性保存初始值,但使用绑定
UpdateSourceTrigger=Explicit
然后,当文本框失去焦点时,您可以检查绑定,如果源和目标值不同,使用此代码片段并评估生成的BindingExpression:
BindingExpression be = tb.GetBindingExpression(TextBox.TextProperty);
可以在这里找到更多代码:
http://bea.stollnitz.com/blog/?p=41