TextChanged事件触发,尽管我使用bool来禁用它
本文关键字:bool 管我 事件 TextChanged | 更新日期: 2023-09-27 18:10:05
我需要重置帧上的所有字段,但同时我需要disable textchanged event
为此,我尝试使用bool变量。像这样:
第一种方法可以让我找到框架上所有的TextBox
子对象。
bool skipChange = false;
public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
yield return (T)child;
}
foreach (T childOfChild in FindVisualChildren<T>(child))
{
yield return childOfChild;
}
}
}
}
这使我能够找到某些类型的所有孩子并重置它。
我将其重置为:
public void resetForm() {
foreach (TextBox tb in FindVisualChildren<TextBox>(sPanelMain))
{
tb.Text = "";
}
}
最后,我需要调用resetForm方法并禁用textchned-fire。
private void btnAddForm_Click(object sender, RoutedEventArgs e)
{
skipChange = true;
resetForm();
skipChange = false;
}
private void PDText_TextChanged(object sender, TextChangedEventArgs e)
{
if (skipChange) { return; }
....
}
在这种方式下,如果skipChange
为true,我尝试退出TextChanged方法。
但是在TextChanged方法中,skipChange总是false,尽管我在调用之前将其设置为true。
Thanx
我不确定这是否有效,但您可以尝试删除并重新附加事件处理程序,如下所示:
public void resetForm() {
foreach (TextBox tb in FindVisualChildren<TextBox>(sPanelMain))
{
tb.TextChanged -= PDText_TextChanged;
tb.Text = "";
tb.TextChanged += PDText_TextChanged;
}
}
skipChange = true;
resetForm();
//Your final assignment is false, try to run it by just assigning it to true
此行:
skipChange = false;
最后我想了想。@Rubidium 37的正确方向和@Florian Gl和@pammy Bhat的建议,我更改了代码,现在开始工作。
从btnAddForm
方法中,我去除了skipChange = true;
和skipChange = false;
private void btnAddForm_Click(object sender, RoutedEventArgs e)
{
resetForm();
}
在resetForm
方法中,我在foreach循环中将skipChange
设置为true,这样,对于每个文本框控件,我都将其设置为true。
public void resetForm() {
foreach (TextBox tb in FindVisualChildren<TextBox>(sPanelMain))
{
skipChange = true;
tb.Text = "";
}
}
在和我换
if (skipChange) { return; }
至:
if (skipChange) { skipChange=false; return; }
这件作品很棒。感谢所有人的建议。