.Net PropertyGrid DropDownList - возвращаемое значение отличается от показанного значения - PullRequest
4 голосов
/ 27 февраля 2009

Я хочу иметь возможность отображать в сетке свойств выпадающий список, который показывает некоторое «строковое» значение, но возвращает значение «int».

Например, пусть установит у меня этот класс:

public class MyObjectOptions : StringConverter
{
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
    {
        return true;
    }

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
    {
        MyObjectCollection mm = new MyObjectCollection();

        List<String> names = new List<String>
        foreach (MyObject m in mm)
        {
            m.Id // Need to store this somewhere ...
            names.Add(m.Name);
        }

        return new StandardValuesCollection(name);
    }

    public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
    {
        return true;
    }
}

Вот мое использование класса в элементе управления сеткой свойств

public class MyObjectProperty
{
    [TypeConverter(typeof(MyObjectOptions))]
    public int Id
    {
        get { return this.id; }
        set { this.id = value; }
    }
}

Как видите, я хочу сохранить идентификатор объекта, но хочу показать его имя в выпадающем списке ... Я пытаюсь использовать хеш-таблицу, но она не работает ...

Кстати - я использую версию 3.5 .Net, но использую только WinForm (не WPF).

1 Ответ

2 голосов
/ 07 апреля 2009

Вы не можете использовать GetStandardValues ​​для этого. Этот метод был бы полезен, если бы вам пришлось ограничить свои целочисленные значения, скажем, 1, 5 и 10.

Если вы хотите отобразить строки в значении вашего свойства, вам просто нужно переопределить методы ConvertTo и ConvertFrom вашего TypeConverter. PropertyGrid будет использовать преобразованные строки в раскрывающемся списке.

Что касается вашей хеш-таблицы, вы можете сохранить ее в TypeConverter, если ее содержимое статично. Если он динамический, лучше всего позволить целевому экземпляру сетки управлять им. Из вашего конвертера вы сможете получить к нему доступ через свойство TypeDescriptorContext.Instance.

Надеюсь, это поможет.

...