ComboBox选择更改事件在ComboBox中的选择根本没有改变时触发

8
你能帮我找到这个错误吗:事件在窗体加载之前就被触发了。我开始看到消息框,然后点击OK,在此之后才会加载主屏幕。之后一切都运行得很完美,我想知道是什么导致ComboBox SelectionChanged事件在加载窗口之前就被触发了。FillComboBoxFamilyData(SegmentCode)只是创建数据集并将值放入ComboBox中。请参考此链接以获取完整的代码。

无法使级联组合框正常工作

任何帮助都将不胜感激。谢谢。

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

    }

你写了这段代码吗,private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e),还是由SDK生成的? - clamchoda
5个回答

17

在数据加载时(由绑定附加),将触发SelectionChanged事件。因此,在事件处理程序中,您必须检查应用程序是否准备就绪并且所有数据已加载和附加。如果没有,请什么也不做并返回事件处理程序。这种行为是按设计的。

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

您可以使用IsLoaded属性来检测是否已经评估了绑定。除非数据绑定引擎已经评估了您的XAML绑定,否则IsLoaded将不为真。

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

感谢HCL的回复。 - MangoTable
感谢HCL的回复。我尝试将代码放在SelectionChanged事件中,但它没有起作用。我认为原因是当事件被触发后,它会进入comboBoxSelection事件内部的代码,此时数据已经加载完成,所以它会继续执行代码。我们必须在Windows加载时停止SelectionChanged事件的执行。我想知道为什么即使在combobox中的选择根本没有改变,它也会触发? - MangoTable

4

您可以使用组合框的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

我知道这是一个老问题,但在我的项目中尝试两次解决它时都得到了与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

有另一个与此相同的问题正在流传(您可以在这里找到它)。它基本上采用了相同的方法。但是我给你点赞,因为我在这里偶然发现了你的答案。谢谢 :) - iam.Carrot

1
你可以添加以下代码,使得当下拉列表展开时,select-change功能生效。
       if (sender is ComboBox comboBox)
        {
            if (comboBox.IsDropDownOpen)
            {
                var comboBoxSelectedItem = comboBox.SelectedItem;
            }
        }

0
我曾经遇到过同样的问题,后来发现在xaml中设置combox的starting-selection-index会在程序加载时触发selectionchanged事件,从而导致错误。
为了解决这个问题,你可以将selection-index设置为-1(默认值)或者在程序加载后使用代码更改combobox的current-selection-index。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接