Winforms:触发哪个事件? combobox.selectedindexchanged 或 bindingsource.currentchanged

Winforms: Which event to fire? combobox.selectedindexchanged OR bindingsource.currentchanged

假设我们在 winforms 应用程序中有一个 Combobox,它的项目绑定到 Bindingsource

我需要在用户更改 combobox 中的 selected 项时触发一个事件。

我应该处理 combobox.selectedindexchanged 事件还是 bindingsource.currentchanged 事件。在性能或其他方面哪个更好?

我进行了很多搜索以找到一篇文章或相关内容,但找不到直截了当的内容。感谢任何建议或解决方法。

更新

我需要在用户 select 来自 combobox 的项目后调用基于 selected 对象 ID 的函数。 (ID 可从 Combobox1.SelectedValuebindingSource1.Current.ID 访问。在这种情况下我应该选择哪个事件?

如果 ComboBox 绑定到 BindingSource,您通常会保留它。如果确实需要利用事件,最好在业务对象中创建更多属性。例如,如果组合框是 Index Value == 0,您想禁用一个按钮,只需在 Button 的 Enabled 属性 绑定到的业务对象中创建一个 属性,例如:

public virtual bool IsFunctionEnabled
{
  get { return (An_Items_SelectedIndex > 0); }
}

如果您确实需要在 ComboBox 的选定索引更改事件中做一些事情,我会倾向于在表示层中进行,因为我不建议使用绑定源控件或其事件。

最好的解决方案是处理业务对象中的所有内容并通过 BindingSources 绑定控件。在表示层中执行任何逻辑都会使测试变得困难,并且更改 BindingSources 中的任何内容都会增加大量测试。

如果您希望在最终用户选择 UI 中的任何项目时处理事件,那么您应该使用 combobox.selectedindexchanged,因为 bindingsource.currentchanged 可能由于数字原因而被触发,例如此处提到的MSDN 博客,BindingSource.CurrentChanged Event 因此,如果您出于 MSDN 中提到的任何原因需要处理事件,那么它将不必要地经过您可能为选择更改事件编码的逻辑。在处理事件时,您的代码应该具体。

毕竟,我开始知道使用 Combobox.SelectedIndexChanded 事件应该更好,因为我正在与用户交互并寻找来自 UI 的响应。虽然这里的事件对我来说是一样的,但是 Bindingsource.CurrentChanged 事件可以用于我想从任何地方跟踪当前对象的变化,比如列表变化之类的,而不是 UI。我相信在这里使用 combobox 事件会更好。