当Combobox绑定到数据时,如何更改Combobox.Text属性?

时间:2010-07-11 13:34:04

标签: c# data-binding combobox keypress

我的场景是这样的:

在运行时,我将ToolStripComboBox绑定到struct:

的数组
cbxTimes.ComboBox.DataSource = PlayTimeLengths;
cbxTimes.ComboBox.DisplayMember = "Description";
cbxTimes.ComboBox.ValueMember = "Minutes";

DropDownStyle的{​​{1}}设置为ToolStripCombobox

一切正常,我可以从下拉列表中选择值,我可以在控件中写入文本。

但是,当我按下某些其他控件时,我想阻止用户按下某些控件并替换Text属性。

我想在DropDown事件中完成此操作:

KeyPress

因此Text属性没有被更改,但我没有得到任何异常。 但是,如果我进一步运行程序(我退出调试),我看到Text属性已更改 - 更具体。我在控件内部看到S的文字。

现在,想象一下我第二次按任意键,并再次在同一事件的调试器中:

private void cbxTimes_KeyPress(object sender, KeyPressEventArgs e)
{
    var cbxSender = ((ToolStripComboBox)sender).ComboBox;
    string S = cbxSender.Text;
    //some operations on the S variable
    cbxSender.Text = S;
    e.Handled = true;
} // breakpoint here shows that cbxSender.Text is not changed to S!

但是这次我把断点放在第二行,在检查Text属性后,我发现它仍然没有改变。尽管我在事件发生时第一次更改了它,并且在控件中可以看到已更改的文本。但是在调试器下我看到了不同的价值,我看到了在开始时设置的价值。值属于结构数组。

那我该怎么办才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

老实说,这是我讨厌Windows窗体数据绑定的事情之一。在WPF中,您不会直接绑定到对象,您将绑定到“ViewModel”对象,该对象封装了您拥有的视图逻辑并将其绑定到它。

我对所有这些的解决方法是根本不使用数据绑定,并根据需要手动填充项目。我可以理解你为什么会遇到这个问题。如果你已经更新了你的底层绑定对象的.Text(或任何导致ToString()显示值的东西),你可能会看到你设置的新值,但这会扰乱底层对象的语义,这是不好的事情。