Сетка свойств создает новый экземпляр свойства - PullRequest
1 голос
/ 29 ноября 2010

Я пытаюсь создать быстрый административный интерфейс, используя встроенную в Windows.Forms PropertyGrid. Мне удалось украсить мои классы данных с соответствующими атрибутами (ExpandableObjectConverter и т. Д.), И все, кажется, работает нормально.

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

Ответы [ 2 ]

2 голосов
/ 29 ноября 2010

Это не так сложно, вот пример кода, который делает такие вещи:

public class MyEditor : UITypeEditor
{
    private IWindowsFormsEditorService _editorService;

    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.DropDown;
    }

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        if (value != null) // already initialized
            return base.EditValue(context, provider, value);

        _editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
        ListBox lb = new ListBox();
        lb.SelectionMode = SelectionMode.One;
        lb.SelectedValueChanged += OnListBoxSelectedValueChanged;

        // TODO: add your items/logic here
        lb.Items.Add(typeof(TYPE1));
        lb.Items.Add(typeof(TYPE2));
        ....
        lb.Items.Add(typeof(TYPEX));

        _editorService.DropDownControl(lb);
        if (lb.SelectedItem == null)
            return base.EditValue(context, provider, value); // no selection, no change

        // instantiate an object (add constructor logic if neede)
        return Activator.CreateInstance((Type)lb.SelectedItem);
    }

    private void OnListBoxSelectedValueChanged(object sender, EventArgs e)
    {
        _editorService.CloseDropDown();
    }
}
0 голосов
/ 29 ноября 2010

Вам необходимо создать UITypeEditor .

...