Combobox选择更改了事件触发器,甚至没有更改ComboBox中的选择

时间:2011-02-16 21:16:26

标签: wpf combobox dataset selectionchanged

你能帮我找到这个错误:在加载windows窗体之前触发事件。我开始看到消息Box然后我单击确定,然后它加载主屏幕。之后一切正常,我想知道甚至在加载窗口之前触发ComboBox SelectionChanged事件.FillComboBoxFamilyData(SegmentCode)只是创建一个数据集并将值放在ComboBox中。请参阅此链接以获取完整代码。

Not able to make cascading comboboxes work

任何帮助都将受到高度赞赏。谢谢。

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

    }

4 个答案:

答案 0 :(得分:16)

此时将加载数据(通过绑定附加),将触发SelectionChanged。因此,如果您的应用程序已准备就绪并且已加载并附加了所有数据,则必须检入事件处理程序。如果没有,则返回事件处理程序而不执行任何操作。这种行为是设计使然。

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

如果已经评估了绑定,则可以使用IsLoaded - 属性来检测。除非数据绑定引擎已经评估了你的xaml绑定,否则IsLoaded将不会成立。

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

答案 1 :(得分:3)

您可以使用组合框的IsLoaded属性来测试它是否已加载。这是我能找到的最干净,最简单的解决方案:

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

答案 2 :(得分:0)

我遇到了同样的问题,我发现使用xaml设置combox的起始选择索引会在程序加载时触发selectionchanged事件,从而导致错误。

要解决此问题,您可以将selection-index设置为-1(默认值) OR 在程序加载后使用代码更改组合框的当前选择索引。

答案 3 :(得分:0)

我知道这是一个老问题,但我遇到过两次尝试在我的项目中解决这个问题,并且与OP有相同的结果。 IsLoaded为true后填充我的列表。所以,我想我会发布我为别人想出来的东西。只需使用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