Включите панель описания в стандартном CollectionEditor - PullRequest
4 голосов
/ 14 октября 2008

У меня есть компонент, который имеет свойство List<T>. Класс в списке имеет каждое из своих свойств, украшенное атрибутом description, но описания не отображаются в Редакторе коллекции

В конструкторе IDE есть способ включить панель описания в стандартном редакторе коллекций? Нужно ли мне наследовать свой собственный редактор типов от CollectionEditor для достижения этой цели?

1 Ответ

8 голосов
/ 14 октября 2008

Обычно вам нужно либо создать собственный редактор, либо подкласс CollectionEditor и связываться с формой. Последнее проще - но не обязательно красивое ...

Далее используется обычная форма редактора коллекций, но она просто сканирует ее на наличие PropertyGrid элементов управления, что позволяет HelpVisible.

.
/// <summary>
/// Allows the description pane of the PropertyGrid to be shown when editing a collection of items within a PropertyGrid.
/// </summary>
class DescriptiveCollectionEditor : CollectionEditor
{
    public DescriptiveCollectionEditor(Type type) : base(type) { }
    protected override CollectionForm CreateCollectionForm()
    {
        CollectionForm form = base.CreateCollectionForm();
        form.Shown += delegate
        {
            ShowDescription(form);
        };
        return form;
    }
    static void ShowDescription(Control control)
    {
        PropertyGrid grid = control as PropertyGrid;
        if (grid != null) grid.HelpVisible = true;
        foreach (Control child in control.Controls)
        {
            ShowDescription(child);
        }
    }
}

Чтобы показать это в использовании (обратите внимание на использование EditorAttribute):

class Foo {
    public string Name { get; set; }
    public Foo() { Bars = new List<Bar>(); }
    [Editor(typeof(DescriptiveCollectionEditor), typeof(UITypeEditor))]
    public List<Bar> Bars { get; private set; }
}
class Bar {
    [Description("A b c")]
    public string Abc { get; set; }
    [Description("D e f")]
    public string Def{ get; set; }
}
static class Program {
    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.Run(new Form {
            Controls = {
                new PropertyGrid {
                    Dock = DockStyle.Fill,
                    SelectedObject = new Foo()
                }
            }
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...