Я делаю приложение на C # / WinForms.Проблема, которую я не мог решить (пока), заключается в том, что когда я изменяю SelectedItem ComboBox программно, он изменяется до тех пор, пока ComboBox не потеряет фокус, после чего он «напоминает» свое значение перед назначением SelectedItem.Я думаю, что это берет старое значение из источника привязки.При выборе элемента с использованием пользовательского интерфейса базовый связанный объект обновляется нормально, но этого не происходит, когда я назначаю новое значение для SelectedItem программно.
Просто для дополнительной информации: я пытаюсь реализовать "отменить",что означает, что я сохраняю каждое изменение где-нибудь, и когда Edit >>> Undo, я отменяю все эти изменения, сделанные пользователем.Интересно, что другие элементы управления (TextBoxes, NumericUpDowns) работают нормально.
Вот подробности:
У меня есть 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]);
}
}
где Combo и ComboList являются пользовательскими классами для загрузки данных из файла конфигурации.Затем я установил элементы Display и Value, а также DataSource:
comboBox.DisplayMember = "Text";
comboBox.ValueMember = "Key";
comboBox.DataSource = items;
"Text" и "Key" являются членами класса 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() {...}
}
Теперь проблема: когдавыполняя отмену, я проверяю все необходимое, чтобы все операции приведения были безопасными и четкими, и пытаюсь «отменить» этот код:
Logger.Info(controls[0], op, "ExecuteUndo");
((ComboBox)controls[0]).Focus();
((ComboBox)controls[0]).SelectedItem = (ComboItem)op.GetOldValue();
Logger.Info(controls[0], "AFTER CHANGE");
Регистратор просто ведет журнал.Объект op берется из последовательности отмены и дает соответствующее значение, используя «GetOldValue ()».Этот код на самом деле влияет на пользовательский интерфейс, но пока элемент управления не потеряет фокус.Это происходит при следующей отмене, которая должна повлиять на другой элемент управления и, таким образом, позволить этому комбинированному списку потерять фокус.
Я уверен, что это происходит с событием comboBox_LostFocus, потому что первое, что я делаю в этом событии, это Logging, и он уже показывает мнезначение, которое НЕ ДОЛЖНО БЫТЬ.