Winforms tools for selection of items using ComboBox - binding datasource
Style &amp; Conventions


Enums and delegates shouldn't be nested in a class.
The default event delegate is the EventHandler. If you want to create a custom event handler then its signature should be 

delegate void ItemSelectedHandler(Object sender, EventArgs e);



but if you need custom event args then you should create a new class derived from EventArgs and with the properties that you need:

class SelectEventArgs : EventArgs
{
    ..ctor
    public IHasHeader item { get; }
}


then you can use the generic event-handler:

public event EventHandler&lt;SelectEventArgs&gt; TemplateSelectionChanged = delegate { };


You shouldn't use any other pattern for events like


public event Action RefreshingTemplatesList = delegate { };



If you want to follow the event style and conventions then stick to the EventHandler and event args.



Binding


public IEnumerable&lt;IHasHeader&gt; TemplatesDatasource
{
  set
  {
      doHandleSelection = false;
      bindSrc.DataSource = value;
      cboxTemplates.DataSource = bindSrc;
      cboxTemplates.SelectedIndex = -1;
      doHandleSelection = true;
  }
}



here you could write

 bindSrc.DataSource = value.ToList();


instead


bindSrc.DataSource = value;



so that you can later reuse this list for adding more items:

public void AddItem(IHasHeader item)
{
    var headers = bindSrc.DataSource as List&lt;IHasHeader&gt;;
    headers.Add(item);
    bindSrc.ResetBindings(false);
}


Don't abbreviate the names like bindSrc. Use full names and preferably meaninigful ones like headerSource or headerBindingSource. bindSrc doesn't say anything about what the binding source holds.