Вопрос привязки данных ComboBox - PullRequest
       18

Вопрос привязки данных ComboBox

1 голос
/ 12 сентября 2009

У меня интересный вопрос о привязке данных, связанный с выпадающим списком. Надеюсь, у кого-то есть хорошее предложение.

У меня есть простая форма, она содержит средство выбора файлов и поле со списком. Каждый раз, когда файл выбирается, я считываю список строк из файла в объект List и устанавливаю comboBox.DataSource = listOfStrings.

В событии загрузки формы я устанавливаю comboBox.DataBindings.Add ("SelectedItem", myObject, "PickedValue");

Цель ясна: каждый раз, когда строка выбирается в выпадающем списке, я хочу записать строку в myObject.PickedValue.

Вот и вся история.

Теперь я запускаю форму, вместо того, чтобы выбрать файл, сначала проверяю поле со списком. Конечно, в этот момент comboBox.DataSource имеет значение null, comboBox.SelectedItem также имеет значение null. Но привязка данных в comboBox уже настроена (так как настройка находится в событии загрузки формы). Теперь мой фокус не может быть перемещен из выпадающего списка в другое место.

Я думаю, причина в том, что когда я пытаюсь проверить комбинированный список, он имеет значение nulected SelectedItem. Когда я пытаюсь переместить фокус в другое место, происходит привязка данных в выпадающем списке. В основе лежит попытка преобразовать выбранный элемент в строку и обновить myObject.PickedValue этой преобразованной строкой. Поскольку вы не можете преобразовать значение NULL в строку, проверка привязки данных завершается неудачно, и механизм проверки не позволяет переместить мой фокус в другое место, и я в этот момент не могу даже выбрать файл.

У меня вопрос: каков нормальный рабочий процесс настройки привязки для сценария моего приложения, чтобы предотвратить эту ловушку? Каков правильный порядок установки такой привязки данных, чтобы я мог проверить свой комбинированный список, прежде чем его источник данных будет заполнен чем-то?

К вашему сведению, я пытался привязать myObject.PickedValue к свойству SelectedText поля со списком (я заметил, что SelectedText является строкой и никогда не будет нулевым, даже когда SelectedItem равен нулю). Но, что интересно, даже если я выберу что-то из выпадающего списка, SelectedText все равно будет пустой строкой, когда сработает привязка данных. Что здесь не так?

Спасибо за любую помощь.

Ответы [ 2 ]

3 голосов
/ 12 сентября 2009

Ошибка немного проще, чем вы описываете: ваш ComboBox потерпит неудачу только потому, что нет выбранного элемента, потому что нечего выбирать.

Я бы просто отключил ComboBox, если нечего выбирать. Это довольно легко сделать. Не забудьте подключить событие PropertyChanged в вашем объекте данных; источник привязки найдет его автоматически с отражением.

class MyData
{
    public event PropertyChangedEventHandler PropertyChanged;

    // ...
    public HasListOfStrings { get { return ListOfStrings != null && 0 < ListOfStrings.Count; } }

    private void LoadListOfStrings
    {
        // ... load the list of strings ...

        if ( PropertyChanged) {
            PropertyChanged(this, "ListOfStrings");
            PropertyChanged(this, "HasListOfStrings");
        }
    }
}

В конструкторе свяжите свойство 'Enabled' ComboBox со свойством HasListOfStrings. Вы можете сделать это в коде с:

listOfStringsComboBox.Bindings.Add ("Enabled", bindingSource, "HasListOfStrings");

Я также рекомендую изменить свойство AutoValidate контейнера (или контейнера контейнера) на EnableAllowFocusChange.

1 голос
/ 12 сентября 2009

Это не кажется правильным; должно быть возможно установить свойство строки в нуль. Возможно, проблема фокуса лежит в другом месте. Вы пытались установить точку останова на свой установщик свойства, чтобы подтвердить свою теорию?

Свойство SelectedText поля со списком относится к тексту, который был выбран в текстовой части поля со списком. Это работает, только если стиль выпадающего меню установлен на комбо. В основном это выделенный текст части текстового поля комбинированного элемента управления (причина, по которой комбинированный список называется «комбинированным», заключается в том, что он представляет собой комбинацию текстового поля и списка выбора). Обычно вы ожидаете, что это свойство будет пустым, если пользователь не редактирует текстовую часть комбо.

Если вы хотите обойти эту проблему, которая согласуется с хорошим пользовательским опытом, попробуйте отключить поле со списком при загрузке формы, а затем включить его при выборе файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...