O ComboBox não atualizará sua lista de exibição, a menos que você altere as seleções primeiro

Atualização: verifiquei a resposta antes de fazer o teste completo, ainda não funciona. Atualizei o código abaixo para que você possa colar em um projeto WinForms vazio e ele deve ser compilado.

ATUALIZAÇÃO: Descobri que se eu alterar o item selecionado na ComboBox para qualquer outro item, ele agora se comporta conforme o esperado (no meu código abaixo, eu mudaria de test1 para test2). Como ainda não recebi nenhuma resposta, mudo a pergunta para isso.

Por que tenho que mudar para um item diferente na caixa de combinação antes de mostrar as alterações que faço na fonte de dados subjacente?

Aqui está um rápido caso de teste do que está acontecendo.

mudançatest1 paratest1asdf texto em txtBrokenclique para confirmaro texto na caixa de combinação não é atualizado.Alterar caixa de combinação para test2mudançatest2 paratest2asdf texto em txtBrokenclique para confirmaro texto na caixa de combinação mostra imediatamente 'test2asdf' ainda é exibidotest1 para o primeiro item no menu suspensomudar paratest1caixa de combinação exibetest1 caixa de texto é exibidatest1asdfatualize a caixa de texto paratest1asdcaixa de combinação é exibida imediatamentetest1asd

Além dos bastidores, alterando o item selecionado no carregamento e retornando (isso parece um hack), como posso corrigir isso?

Eu tenho um databound de caixa de combinação para umBindingSource ligado a umList<Holder> temHolder.Name como seu valor de exibição. Eu também tenho uma caixa de texto vinculada aHolder.Name mas se eu alterar o texto na caixa de texto, ele não mudará o que é exibido na caixa de combinação. Alterar itens selecionados e voltar atrás mostrará o texto atualizado na caixa de texto, mas ainda terá o valor antigo exibido na caixa de combinação. Como faço para atualizar o item na caixa de combinação?

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace Sandbox_Form
{
    public class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            lstBroken = new BindingList<Holder>();
            lstBroken.Add(new Holder("test1"));
            lstBroken.Add(new Holder("test2"));
            bsBroken = new BindingSource(lstBroken, null);
            cmbBroken.DataSource = bsBroken;
            cmbBroken.DisplayMember = "Name";
            cmbBroken.SelectedIndex = 0;
            txtBroken.DataBindings.Add("Text", bsBroken, "Name");
            txtBroken.TextChanged += new EventHandler(txtBroken_TextChanged);

        }

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        void txtBroken_TextChanged(object sender, EventArgs e)
        {
            ((Control)sender).FindForm().Validate();
        }
        private BindingSource bsBroken;
        private BindingList<Holder> lstBroken;
        private ComboBox cmbBroken;
        private TextBox txtBroken;
        private Label label1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.cmbBroken = new System.Windows.Forms.ComboBox();
            this.txtBroken = new System.Windows.Forms.TextBox();
            this.label1 = new System.Windows.Forms.Label();
            this.SuspendLayout();
            // 
            // cmbBroken
            // 
            this.cmbBroken.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
            this.cmbBroken.FormattingEnabled = true;
            this.cmbBroken.Location = new System.Drawing.Point(12, 32);
            this.cmbBroken.Name = "cmbBroken";
            this.cmbBroken.Size = new System.Drawing.Size(94, 21);
            this.cmbBroken.TabIndex = 0;
            // 
            // txtBroken
            // 
            this.txtBroken.Location = new System.Drawing.Point(13, 60);
            this.txtBroken.Name = "txtBroken";
            this.txtBroken.Size = new System.Drawing.Size(93, 20);
            this.txtBroken.TabIndex = 1;
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(13, 13);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(41, 13);
            this.label1.TabIndex = 2;
            this.label1.Text = "Broken";
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 262);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.txtBroken);
            this.Controls.Add(this.cmbBroken);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private void cmbWorks_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
    }
    public class Holder
    {
        public Holder(string name)
        {
            Name = name;
        }
        private string _Name;
        public string Name
        {
            get { return _Name; }
            set
            {
                _Name = value;
            }
        }
    }
}

Se eu ligar a umList<String> em vez disso, usandoHolder.Name funciona como esperado (este é apenas um modelo simples, a classe real tem mais do que apenas um nome para que uma lista de strings não funcione). Eu acho que isso é uma pista do que está errado, mas não sei o que é. Usar um Observável em vez de uma lista não faz diferença.

questionAnswers(1)

yourAnswerToTheQuestion