C# 在WPF的codebehind中执行此操作时,如何避免出现组合框SelectionChanged事件?
我有一个函数将更改组合框选定的索引,因此combobox\u selectionchanged事件将自动上升,但此事件的处理程序将再次调用我的函数,因此该函数将被调用两次 是否有任何方法可以防止在下面的函数中出现选择更改事件C# 在WPF的codebehind中执行此操作时,如何避免出现组合框SelectionChanged事件?,c#,events,C#,Events,我有一个函数将更改组合框选定的索引,因此combobox\u selectionchanged事件将自动上升,但此事件的处理程序将再次调用我的函数,因此该函数将被调用两次 是否有任何方法可以防止在下面的函数中出现选择更改事件 private void Refresh_Window() { Monthes_ComboBox.SelectedIndex = DM.Month - 1; } 我想避免对我的问题进行冗长的描述,所以我只是问了这个问题。我正在设计一个日历,组合框包含一年中的几个月
private void Refresh_Window()
{
Monthes_ComboBox.SelectedIndex = DM.Month - 1;
}
我想避免对我的问题进行冗长的描述,所以我只是问了这个问题。我正在设计一个日历,组合框包含一年中的几个月,但有两个按钮将转到下一个月或上一个月,因此我必须通过代码更改组合框索引,我创建了一个函数,并在表单加载和组合框选择中调用它,然后单击按钮,我可以以更好的方式设计它吗?而且Refresh\u window不仅改变了combobox\u selectedindex,它还改变了表单中的所有标签和文本块,所以我只想让Refresh\u window完成所有的更改,如果你使用一个函数来引发一个事件,并且你从事件处理程序调用了同一个函数,据我所知,这至少是错误的,不是最优的
private bool _refreshCalled = false;
private void Refresh_Window()
{
_refreshCalled = true;
try
{
....
Monthes_ComboBox.SelectedIndex = DM.Month - 1;
....
}
finally
{
_refreshCalled = false;
}
}
private void OnComboBoxSelectedChanged(object sender, EventArgs e)
{
...
if (!_refreshCalled)
{
Refresh_Window();
}
...
}
通常,使用组合框,您可以简单地分配SelectedValue
,控件将使用该值选择项目,然后所选索引将更改为该项目的索引,您实际上不需要直接设置所选索引
如果你真的想按索引工作,你可以自由地这样做,但我会避免这种意大利面编码,因为如果附加到激发的事件的事件处理程序也调用了相同的方法,那么这种方法会更改选定的索引…有两种很好的方法可以做到这一点:
- 设置一个变量,该变量指示combobox中的选定索引正在更改(您需要从内置combobox类派生)。如果所选索引再次从调用堆栈中的较深位置更改,则仍然会设置该变量,您可以在再次尝试更改所选索引之前读取该变量
- 类似地,如果调用堆栈涉及附加到combobox的处理程序,则可以重写OnSelectedIndexChanged,如果这是所选索引第二次更改,则不执行任何逻辑
-=YourEventHandler
,在刷新窗口的代码之后调用+=YourEventHandler
。