BindingSource的BindingComplete事件未触发,附ComboBox绑定代码
我来帮你排查这个BindingComplete事件没触发的问题,结合你给出的代码片段,大概率是这几个环节出了问题,咱们一步步来:
1. 先检查数据源是否真的完成了绑定操作
BindingComplete事件只有在**数据绑定真正完成(包括初始化、更新)**的时候才会触发。你现在只设置了bsContractors.DataSource = typeof(Contractor);,但如果这个BindingSource里没有实际的数据源集合(比如只是指定了类型,没给具体的List<Contractor>数据),或者ComboBox的绑定没有走完初始化流程,事件自然不会触发。
解决办法:
- 给BindingSource赋值实际的数据源集合,比如:
bsContractors.DataSource = new List<Contractor> { /* 这里添加你的Contractor实例数据 */ }; - 确保ComboBox的
DisplayMember和ValueMember已经正确设置,因为SelectedValue绑定依赖这两个属性(对应你的Contractor类里的具体字段):cmbContract_Contractors.DisplayMember = "ContractorName"; // 替换成你用来显示的属性名 cmbContract_Contractors.ValueMember = "ContractorId"; // 替换成你用来作为值的属性名
2. 核对绑定的数据源和触发逻辑
你代码里绑定的是bsProject,但前面定义的是bsContractors——这很可能是笔误!如果绑定的是不同的BindingSource,那bsContractors的BindingComplete当然不会触发,这点一定要仔细检查。
另外,默认的Binding是单向绑定(从数据源到控件),且只有数据源更新时才会触发事件。你可以在添加DataBinding时明确指定更新模式,确保控件值变化时能同步触发绑定事件:
cmbContract_Contractors.DataBindings.Add( new Binding("SelectedValue", this.bsContractors, // 这里要和你要监听的BindingSource一致 "对应的属性名", true, DataSourceUpdateMode.OnPropertyChanged));
3. 确认Contractor类是否实现了INotifyPropertyChanged接口
如果你的Contractor类没有实现这个接口,当数据源的属性发生变化时,BindingSource无法感知到变化,也就不会触发BindingComplete事件。
解决办法:
- 让
Contractor类实现INotifyPropertyChanged:public class Contractor : INotifyPropertyChanged { private int _contractorId; public int ContractorId { get => _contractorId; set { if (_contractorId != value) { _contractorId = value; OnPropertyChanged(nameof(ContractorId)); } } } // 其他属性同理实现 public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
4. 调试阶段可以手动触发绑定
如果以上都检查没问题,你可以在初始化完成后手动调用ResetBindings,强制触发绑定操作,看看事件会不会触发:
bsContractors.ResetBindings(false);
你可以先从「绑定的BindingSource是否正确」「数据源是否有实际数据」这两点入手,这两个是最常见的坑。
内容的提问来源于stack exchange,提问作者Al Lelopath

