Windows Forms ComboBox - привязка данных без учета регистра - PullRequest
3 голосов
/ 13 сентября 2010

Если я связываю данные со списком winforms, есть ли способ сделать привязку нечувствительной к регистру?

Например, если поле со списком привязано к свойству со значением FOO, заставить его выбрать элемент со списком со значением Foo?

Ответы [ 2 ]

4 голосов
/ 13 сентября 2010

Нет, это невозможно.Это внутренне реализовано с использованием отражения с учетом регистра.

2 голосов
/ 21 сентября 2012

Немного опоздал с игрой, но вот что я сделал, чтобы разрешить привязку без учета регистра к WinForms ComboBox:

Я создал свой собственный класс, который наследуется от ComboBox, и добавил следующееСвойство для привязки моих данных (простите за автоматическое преобразование из VB.NET):

public object Value {
    get {
        if (string.IsNullOrEmpty(ValueMember)) {
            return Text;
        } else {
            return SelectedValue;
        }
    }
    set {
        if (DesignMode)
            return;

        // If we're databound, Value is the SelectedValue.  Otherwise, it's the Text.
        object oldValue = string.IsNullOrEmpty(ValueMember) ? Text : SelectedValue;

        // Want to make sure we're comparing apples to apples, and not specific instances of apples.
        string strOld = oldValue == null ? string.Empty : Convert.ToString(oldValue);
        string strNew = value == null ? string.Empty : Convert.ToString(value);

        if (!string.Equals(strOld, strNew, StringComparison.OrdinalIgnoreCase)) {
            if (ValueMember.HasValue) {
                if (value != null && !string.IsNullOrEmpty(Convert.ToString(value))) {
                    SelectedItem = Items.OfType<object>.FirstOrDefault((System.Object i) => string.Equals(Convert.ToString(FilterItemOnProperty(i, ValueMember)), strNew, StringComparison.OrdinalIgnoreCase));
                } else {
                    SelectedIndex = -1;
                }
            } else {
                Text = value != null ? value.ToString : string.Empty;
            }
            ValidateField();
            if (PropertyChanged != null) {
                PropertyChanged(this, new PropertyChangedEventArgs("Value"));
            }
        }
    }
}

ValidateField - это пользовательский метод, который вы, вероятно, можете игнорировать, но вы захотите реализовать INotifyPropertyChangedдля свойства Value.

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