C# 确定一个文本框';在失去焦点的事件中,它以前的价值是多少?WPF

C# 确定一个文本框';在失去焦点的事件中,它以前的价值是多少?WPF,c#,wpf,wpf-controls,C#,Wpf,Wpf Controls,我有一个文本框,上面有一个onlostfocus事件 在lostfocus方法中,是否有一种方法可以确定用户是否实际更改了其中的值? i、 我如何获得它的任何以前的值 谢谢将原始值存储在某个地方。您可以编写一个公共组件来存储获得焦点时的值,并在失去焦点时比较该值。我在ASP.NET中完成了这项工作,它运行得非常好。我想到的是一种两阶段的方法。处理文本框上的TextChanged事件并将其标记。然后,当出现文本框OnLostFocus时,您只需检查您的标志,查看文本是否已更改 下面是一段关于如何处

我有一个文本框,上面有一个onlostfocus事件

在lostfocus方法中,是否有一种方法可以确定用户是否实际更改了其中的值? i、 我如何获得它的任何以前的值


谢谢

将原始值存储在某个地方。您可以编写一个公共组件来存储获得焦点时的值,并在失去焦点时比较该值。我在ASP.NET中完成了这项工作,它运行得非常好。

我想到的是一种两阶段的方法。处理文本框上的
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;
        }              
    }
}

与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"); 
      }
   }

通过数据绑定解决此问题的另一种方法: 将TextBox.Text绑定到属性,该属性保存初始值,但使用与的绑定
UpdateSourceTrigger=Explicit
然后,当文本框失去焦点时,如果源值和目标值不同,您可以使用此代码段检查绑定,并计算生成的BindingExpression:
BindingExpression be=tb.GetBindingExpression(TextBox.TextProperty)
可以在此处找到更多代码:

感谢各位的回复……但是,是否可以在不将值存储在局部变量中的情况下检查它?似乎有点unclean@guest我会说不,因为一旦编写了依赖属性TextProperty,您就无法访问旧值。TextBox不包含更改跟踪的状态信息(请参阅)。您始终可以创建一个新的UserControl,其中包含一个文本框,并整齐地包含用于更改跟踪的附加逻辑和状态。下面的人正确地回答了问题,但您正确地回答了问题,+1代表您。