我的场景是这样的:
在运行时,我将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属性后,我发现它仍然没有改变。尽管我在事件发生时第一次更改了它,并且在控件中可以看到已更改的文本。但是在调试器下我看到了不同的价值,我看到了在开始时设置的价值。值属于结构数组。
那我该怎么办才能解决这个问题?
答案 0 :(得分:0)
老实说,这是我讨厌Windows窗体数据绑定的事情之一。在WPF中,您不会直接绑定到对象,您将绑定到“ViewModel”对象,该对象封装了您拥有的视图逻辑并将其绑定到它。
我对所有这些的解决方法是根本不使用数据绑定,并根据需要手动填充项目。我可以理解你为什么会遇到这个问题。如果你已经更新了你的底层绑定对象的.Text(或任何导致ToString()显示值的东西),你可能会看到你设置的新值,但这会扰乱底层对象的语义,这是不好的事情。