2011-02-16 71 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; 
}