Как изменить свойство Combobox.Text, когда Combobox привязан к данным? - PullRequest
0 голосов
/ 11 июля 2010

Мой Scenerio выглядит следующим образом:

Во время выполнения я привязываю ToolStripComboBox к массиву структуры:

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

DropDownStyle из ToolStripCombobox устанавливается в DropDown.

Все работает нормально, я могу выбрать значения из выпадающего списка и написать текст в элементе управления.

Однако я хотел запретить пользователю нажимать некоторые элементы управления и чередовать свойство Text, когданажаты некоторые другие элементы управления.

Я пытаюсь выполнить это в событии KeyPress:

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 не было изменено, но я не получил никаких исключений.Однако, если я продолжу программу (я выйду из процесса отладки), я увижу, что свойство Text изменилось - чтобы быть более конкретным.Я вижу текст из S внутри элемента управления.

Теперь представьте, что я нажимаю любую клавишу во второй раз, и снова я нахожусь в отладчике в том же событии:

private void cbxTimes_KeyPress(object sender, KeyPressEventArgs e)
{
    var cbxSender = ((ToolStripComboBox)sender).ComboBox;
    string S = cbxSender.Text; // this time breakpoint is here
    //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 голосов
/ 11 июля 2010

Честно говоря, это одна из вещей, которые я ненавижу в привязке данных Windows Forms. В WPF вы не привязываете объекты напрямую, вы привязываете к объекту ViewModel, который инкапсулирует эту логику представления, и вместо этого привязываете к ней.

Мой обходной путь ко всему этому - просто не использовать привязку данных для этого случая и вручную заполнять элементы по мере необходимости. Я могу понять, почему у вас может быть эта проблема. Если бы вы обновили .Text вашего нижележащего связанного объекта (или то, что заставляет ToString () отображать значение), вы, вероятно, увидели бы новое значение, которое вы установили, но это нарушает семантику ваших базовых объектов, что не является хорошим Вещь.

...