2011-02-16 86 views
5

你能幫我找到在這一個錯誤:即使加載窗體窗體之前事件觸發。我開始看到消息框,然後單擊確定,之後它加載主屏幕。之後,一切正常,我不知道什麼觸發ComboBox SelectionChanged事件之前,甚至加載窗口.FillComboBoxFamilyData(SegmentCode)只是創建一個數據集並將值置於ComboBox中。請參閱此鏈接獲取完整的代碼。Combobox選擇更改事件觸發器,甚至沒有改變組合框中的選擇

Not able to make cascading comboboxes work

任何幫助將是非常appreciated.Thanks。

<ComboBox Height="23" HorizontalAlignment="Left" Margin="35,26,0,0" Name="comboBox1" VerticalAlignment="Top" Width="205" ItemsSource="{Binding Source={StaticResource tblSegmentViewSource}}" DisplayMemberPath="Segment Name" SelectedValuePath="Segment Code" SelectionChanged="comboBox1_SelectionChanged"/> 
<ComboBox Margin="304,26,395,93" Name="comboBox2" /> 


    private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 

     MessageBox.Show(comboBox1.SelectedValue.ToString()); 
     SegmentCode = Convert.ToInt32(comboBox1.SelectedValue.ToString()); 
     FillComboBoxFamilyData(SegmentCode); 

    } 
+0

你寫的代碼,私人無效comboBox1_SelectionChanged(對象發件人,SelectionChangedEventArgs E),或者是由SDK產生的? – clamchoda 2011-02-16 21:17:57

回答

14

當前數據將被加載(通過綁定附加),SelectionChanged將被觸發。因此,如果您的應用程序已準備好並且所有數據都已加載並附加,則必須檢入事件處理程序。如果沒有,則返回事件處理程序而不做任何事情。這是行爲設計​​。

ItemsSource="{Binding Source={StaticResource tblSegmentViewSource}}" 

可以使用IsLoaded - 屬性進行檢測,如果綁定已經進行了評估。除非數據綁定引擎評估了xaml綁定,否則IsLoaded將不成立。

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)  { 
    if(!IsLoaded){ 
     return; 
    } 
    .... your code here 
+0

謝謝HCL的迴應。 – MangoTable 2011-02-17 19:22:37

0

我有這個同樣的問題,我發現,當程序加載它導致錯誤設置使用XAML的COMBOX的出發選擇指數將觸發SelectionChanged事件。

要解決您可以將選擇索引設置爲-1(默認值)在程序加載後使用代碼更改組合框的當前選擇索引。

0

我知道這是一個古老的問題,但我偶然發現它兩次,試圖解決這個問題在我的項目中,並與OP有相同的結果。我的列表在IsLoaded爲真後填充。所以,我想我會發布我爲別人找到的。只需使用DropDowOpened事件將bool設置爲true即可。這樣SelectionChanged事件不會觸發,直到用戶實際點擊下拉菜單爲止。

private bool UserSeriesChange; 
private void comboBox1_DropDownOpened(object sender, EventArgs e) 
{ 
     UserSeriesChange = true;  
} 

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if(!UserSeriesChange){ 
     return; 
    } 
    .... your code here 
1

您可以使用組合框的IsLoaded屬性來測試它是否已加載。這是我能找到的最清潔,最簡單的解決方案:

var comboBox = (ComboBox)sender; 
if (!comboBox.IsLoaded) 
{ 
    // This is when the combo box is not loaded yet and the event is called. 
    return; 
} 
相關問題