C# Winforms组合框SelectedItem更改不会影响BindingSource

C# Winforms组合框SelectedItem更改不会影响BindingSource,c#,winforms,binding,combobox,selecteditem,C#,Winforms,Binding,Combobox,Selecteditem,我正在制作C/WinForms应用程序。我还不能解决的问题是,当我以编程方式更改ComboBox的SelectedItem时,它会一直更改,直到ComboBox失去焦点,之后它会在指定SelectedItem之前提醒其值。我认为它从绑定源获取旧值。当使用UI选择项目时,底层绑定对象会正常更新,但当我以编程方式为SelectedItem分配新值时,它不会更新 仅提供其他信息:我正在尝试实现撤销,这意味着我正在将每个更改保存在某个位置,当编辑>>>撤销时,我正在撤销用户所做的所有这些更改。有趣的是,

我正在制作C/WinForms应用程序。我还不能解决的问题是,当我以编程方式更改ComboBox的SelectedItem时,它会一直更改,直到ComboBox失去焦点,之后它会在指定SelectedItem之前提醒其值。我认为它从绑定源获取旧值。当使用UI选择项目时,底层绑定对象会正常更新,但当我以编程方式为SelectedItem分配新值时,它不会更新

仅提供其他信息:我正在尝试实现撤销,这意味着我正在将每个更改保存在某个位置,当编辑>>>撤销时,我正在撤销用户所做的所有这些更改。有趣的是,其他控件文本框、数字上下都可以正常工作

详情如下:

我有一个ComboBox,绑定到ComboItem对象,如下所示:

ComboBox comboBox = new ComboBox();
List<ComboItem> items = new List<ComboItem>();
ComboList comboList = Configuration.ComboList.LoadComboList();

Combo myCombo = comboList.GetCombo(control.MemberName);
if (myCombo != null)
{
    items.Add(new ComboItem(0, "", 0.0, 0.0));
    for (int index = 0; index < myCombo.ComboItems.Count; index++)
    {
        items.Add(myCombo.ComboItems[index]);
    }
}
文本和键是ComboItem类的成员:

public class ComboItem
{
    public int Key { get; set; }
    public string Text { get; set; }
    public double Coef1 { get; set; }
    public double Coef2 { get; set; } 

    public void CopyValues() {...}
    public override bool Equals() {...}
}
现在的问题是:在执行undo时,我检查了所有安全和清除强制转换操作所需的一切,并尝试使用以下代码进行撤销:

Logger.Info(controls[0], op, "ExecuteUndo");
((ComboBox)controls[0]).Focus();
((ComboBox)controls[0]).SelectedItem = (ComboItem)op.GetOldValue();
Logger.Info(controls[0], "AFTER CHANGE");
记录器只是记录。op对象取自undo序列,它使用GetOldValue给出适当的值。这段代码实际上正在影响UI,但直到控件失去焦点为止。它发生在下一次撤消时,这会影响其他控件,从而使此组合框失去焦点


我确信这种情况会发生在comboBox\u LostFocus事件上,因为我对此事件所做的第一件事是记录日志,它已经向我显示了不应该显示的值。

我认为您看到的问题是comboBox显示了一个值,但尚未将值写入绑定源,这在失去焦点之前不会发生

假设只有一个与组合框关联的数据绑定,您可以尝试在选择某个项时执行以下操作来写入数据:

为了确保安全,您可以从designer订阅此事件,也可以手动连接:

public Form1() {
  InitializeComponent();
  comboBox.SelectedIndexChanged += comboBox_SelectedIndexChanged;
}

您订阅了组合框中的哪些事件?如果订阅,请向我们显示SelectedIndexChanged和/或SelectedValueChanged事件的代码。到目前为止,我将尝试使用ComboBox控件[0]。SelectedValue=ComboItemop.GetOldValue;而不是SelectedItem。此外,你为什么设置焦点?请出示您选择的XXXchanged EventHandler,我目前已订阅comboBox\u GotFocus和comboBox\u LostFocus。设置焦点的目的是向用户显示撤消操作,我的意思是我跳转到使用撤消操作更改的控件上。对于textbox和numericUpDown,我关注它并选择其中的文本/数字。如果有不同的解决方案,我准备试试。请向我们展示您选择的xxxchanged事件处理程序-我没有这样的事件处理程序,这很糟糕吗?从UI中选择ComboBox项时,绑定似乎在没有SelectedIndexChanged或SelectedValueChanged的情况下更改。和SelectedValue没有帮助。这可能很有用:我使用配置将数据绑定到控件并这样做:Control.DataBindings.AddpropertyName、bs、key、true、DataSourceUpdateMode.OnPropertyChanged;其中,从配置读取propertyName和key,bs为BindingSource:BindingSource bs=new BindingSource;bs.DataSource=类型;数据绑定可以在属性更改或验证时绑定。如果您想立即生效,请使用OnPropertyChanged。完全正确!这就是我需要的。我需要将新值写入绑定中,在我的例子中,它实际上是旧值。非常感谢。对这种类型的需要不是使绑定变得多余吗?它使windows中的绑定成为人类已知的ar*e中最大的痛苦。刚从angularjs项目中诞生,令人惊讶的是有人设法使绑定变得如此复杂,让开发人员难以实现。
private void comboBox_SelectedIndexChanged(object sender, EventArgs e) {
  comboBox.DataBindings[0].WriteValue();
}
public Form1() {
  InitializeComponent();
  comboBox.SelectedIndexChanged += comboBox_SelectedIndexChanged;
}