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

TextChanged事件触发,尽管我使用bool来禁用它

我不确定这是否有效,但您可以尝试删除并重新附加事件处理程序,如下所示:

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; }

这件作品很棒。感谢所有人的建议。