2011-08-04 64 views
0

我有一個函數會改變組合框選擇的索引,所以combobox_selectionchanged事件會自動上升,但這個事件的處理程序再次調用我的函數,所以函數將被調用兩次!如何避免在WPF代碼隱藏時出現ComboBox SelectionChanged事件?

有沒有什麼辦法可以防止在函數中的上升的selection_changed事件?

private void Refresh_Window() 
{ 
    Monthes_ComboBox.SelectedIndex = DM.Month - 1; 
} 

我想避免我的問題很長的描述,所以我剛纔問的問題。我正在設計一個日曆,combo_box包含一年的monthes,但有兩個按鈕會轉到nextmon或上個月,所以我必須通過代碼更改combo_box索引,我創建了一個函數,然後在form_load中調用它和combobox_Selection_changed和button_click我可以更好地設計它嗎?和Refresh_window不只是改變combobox_selectedindex,它的變化形式的所有標籤和的TextBlocks,所以我只是想,如果你使用的功能,以提高一個事件被Refresh_window

+0

那麼,誰來調用Refresh_Window()以及何時? –

+0

我想避免關於我的問題的長篇描述,所以我只是問了這個問題。我正在設計一個日曆,combo_box包含一年的monthes,但有兩個按鈕會轉到nextmon或上個月,所以我必須通過代碼更改combo_box索引,我創建了一個函數,然後在form_load中調用它和combobox_Selection_changed和button_click我可以更好地設計它嗎? Refresh_window不只是改變combobox_selectedindex,它改變了所有的標籤和TextBlocks的形式,所以我只是想要所有的改變都由Refresh_window –

回答

1
private bool _refreshCalled = false; 

private void Refresh_Window() 
{ 
    _refreshCalled = true; 
    try 
    { 
     .... 
     Monthes_ComboBox.SelectedIndex = DM.Month - 1; 
     .... 
    } 
    finally 
    { 
     _refreshCalled = false; 
    } 
} 

private void OnComboBoxSelectedChanged(object sender, EventArgs e) 
{ 
    ... 
    if (!_refreshCalled) 
    { 
     Refresh_Window(); 
    } 
    ... 
} 
+0

完成謝謝jalal,我已經使用過這種方法,有沒有辦法不允許refresh_window上升任何事件? –

+0

如果您希望任何事件不會增加,那麼您可以在代碼觸發' - = YourEventHandler'之前調用事件,在'Refresh_Window'代碼之後調用'+ = YourEventHandler'。 –

0

所做的一切變化和您調用從事件處理程序的相同功能,到我所瞭解的這是至少嚴重的設計師,而不是最佳的。

一般用組合框可以簡單地指定SelectedValue並且控件將選擇具有該值的項目,然後選定的索引將變爲這樣的項目的索引,那麼您並不需要直接設置所選擇的索引。 ..

如果你真的想通過指數的工作,反正你可以自由地做,但我會避免這種麪條編碼具有改變選擇的索引,如果同樣的方法也被配屬到事件的事件處理函數調用的方法發射...

+0

我想避免關於我的問題的長篇描述,所以我只是問了這個問題。我正在設計一個日曆,combo_box包含一年的monthes,但有兩個按鈕會轉到nextmon或上個月,所以我必須通過代碼更改combo_box索引,我創建了一個函數,然後在form_load中調用它和combobox_Selection_changed和button_click我可以更好地設計它嗎? 和Refresh_window不只是改變了combobox_selectedindex,它改變了所有的標籤和TextBlocks的形式,所以我只想要所有的改變都由Refresh_window完成 –

0

有幾個好方法可以做到這一點:

  • 設置一個變量,指示所選索引在組合框中發生變化(您需要從內置ComboBox類派生)。如果選中的索引從調用堆棧中的更深處再次更改,則該變量仍將被設置,您可以在嘗試再次更改所選索引之前閱讀它。類似地,如果調用堆棧涉及附加到組合框的處理程序,則可以覆蓋OnSelectedIndexChanged並且不執行任何邏輯(如果這是所選索引第二次更改)。

+0

我用第二種方法,我只是尋找更好的方法,如果有 –