你能帮我找到这个错误:在加载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);
}
答案 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