你能帮我找到这个错误吗:事件在 Windows 窗体加载之前触发。我开始看到消息框,然后单击“确定”,之后它加载主屏幕。之后一切正常,我想知道在加载窗口之前是什么触发了 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);
}
当数据被加载(通过绑定附加)时,SelectionChanged 将被触发。因此,您必须检查您的事件处理程序是否已准备好并且所有数据均已加载并附加。如果没有,则返回事件处理程序而不执行任何操作。此行为是设计使然。
ItemsSource="{Binding Source={StaticResource tblSegmentViewSource}}"
您可以使用
IsLoaded
属性来检测绑定是否已被评估。除非数据绑定引擎评估了您的 xaml 绑定,否则 IsLoaded
不会成立。
private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) {
if(!IsLoaded){
return;
}
.... your code here
您可以使用组合框的 IsLoaded 属性来测试它是否已加载。这是我能找到的最干净、最简单的解决方案:
var comboBox = (ComboBox)sender;
if (!comboBox.IsLoaded)
{
// This is when the combo box is not loaded yet and the event is called.
return;
}
我知道这是一个老问题,但我在我的项目中遇到过两次试图解决这个问题,并得到了与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
我也遇到了同样的问题,我发现使用 xaml 设置组合框的起始选择索引会在程序加载时触发选择更改事件,从而导致错误。
要解决此问题,您可以将选择索引设置为-1(默认值)或在程序加载后使用代码更改组合框的当前选择索引。
您可以添加以下代码,使下拉列表展开时选择更改工作
if (sender is ComboBox comboBox)
{
if (comboBox.IsDropDownOpen)
{
var comboBoxSelectedItem = comboBox.SelectedItem;
}
}