确定文本框在丢失的焦点事件中的先前值? WPF

时间:2010-07-21 13:35:57

标签: c# wpf wpf-controls

我有一个文本框并且上面有一个onlostfocus事件。

在lostfocus方法中,有没有办法可以确定用户是否实际更改了其中的值? 即如何掌握其中的任何先前价值?

由于

4 个答案:

答案 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