簡體   English   中英

盡管我使用bool禁用了TextChanged事件觸發

[英]TextChanged event firing although I use bool to disable that

我需要重置框架上的所有字段,但是同時我需要disable textchanged event

為此,我嘗試使用布爾變量。 像這樣:

第一種使我能夠找到框架上所有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方法並禁用textchnged觸發。

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。

謝謝

skipChange = true;
resetForm();

//Your final assignment is false, try to run it by just assigning it to true

這行:

skipChange = false;

我不確定是否可行,但是您可以嘗試刪除並重新附加事件處理程序,如下所示:

public void resetForm() {
    foreach (TextBox tb in FindVisualChildren<TextBox>(sPanelMain))
    {
        tb.TextChanged -= PDText_TextChanged;
        tb.Text = "";    
        tb.TextChanged += PDText_TextChanged;            
    }
 }

最后我明白了。 @Rubidium 37的Whit正確方向以及@Florian Gl和@ pammy的建議Bhat我更改了代碼,現在可以工作了。

我從btnAddForm方法中刪除skipChange = true; skipChange = false;

private void btnAddForm_Click(object sender, RoutedEventArgs e)
{
    resetForm();
}

resetForm methof我設置skipChange在foreach循環為真,與每一個TextBox控件我把它放在正確的方式。

public void resetForm() {
    foreach (TextBox tb in FindVisualChildren<TextBox>(sPanelMain))
    {
        skipChange = true;
        tb.Text = "";                
    }
}

然后在和我改變

if (skipChange) { return; }

至:

if (skipChange) { skipChange=false; return; }

這項工作很棒。 感謝所有人的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM