2010-04-06 222 views
3

是否有可能知道任何文本框值是否在应用程序中发生了更改。 我有大约30个文本框,我只想运行一部分代码,如果任何一个文本框的值已经改为30以外。有没有办法我可以知道。文本框值已更改

回答

7

当内容发生变化时,每个文本框将引发事件TextChanged。但是,这要求您订阅每个事件。

好消息是,您可以多次使用相同的方法订阅活动。处理程序有一个参数sender,您可以使用该参数来确定您的30个文本框中的哪一个实际上引发了该事件。

您还可以使用GotFocusLostFocus事件来跟踪实际更改。您需要将原始值存储在GotFocus上,然后与LostFocus上的当前值进行比较。这解决了两个TextChanged事件相互抵消的问题。

+0

的问题是 “有值改为” 不“有TextChanged事件触发“。如果用户将文本“香蕉”编辑为“bananaX”,然后按退格,他又回到“香蕉”......并且没有任何变化。肮脏的检测从WPF控件丢失... – Jack 2013-02-21 18:56:15

+0

@杰克 - 增加了一个可能的解决方案。 – ChrisF 2013-02-21 22:37:58

+0

如果使用MVVM + Binding,那么在WPF中没有简单的方法来做到这一点,因为Binding类(它完全可以检测正在编辑的)不会... – Jack 2013-02-23 08:04:52

2

您可以为每个TextBox的TextChanged事件分配一个事件处理程序。所有这些都可以在代码中分配给相同的事件处理程序。然后你会知道文本何时改变。您可以在课程中设置一个布尔标志字段来记录发生了变化。

1

试试这个。将此代码添加到加载/构造函数。不需要在XAML中明确指定事件

this.AddHandler(TextBox.TextChangedEvent, new TextChangedEventHandler(TextChanged)); 
private void TextChanged(object Sender, TextChangedEventArgs e) 
{ 
    //ToDO (use sender to identify the actuale text from where it fired } 
} 
1

这可能是粗糙和准备好的一面,但我是这样做的。

在构造中,我创建

布尔bChanged = FALSE;

在每个控制(实际上相同的每个)的TextChanged事件处理程序中,我把

bChanged = TRUE;

适当时,我可以做一些处理,并将bChanged设置为false。

1

你也可以这样做:

在构造函数:

MyTextBox.TextChanged += new TextChangedEventHandler(TextChanged); 

然后将此方法:

private void TextChanged(object Sender, TextChangedEventArgs e){ 
      //Do something 
     }