Как создать UserControl с коллекцией, которую можно редактировать во время разработки? - PullRequest
0 голосов
/ 23 ноября 2010

Я создаю класс с именем PanelsList, который в основном представляет собой TabControl без заголовков сверху, поэтому страницы можно изменять только программно.Каждая «вкладка» будет и экземпляром класса с именем PanelsListItem, производным от Panel.Я также создал класс PanelsListItemCollection, который реализует ICollection и ICollection<PanelsListItem>.Поэтому я добавил следующее к своему PanelsList:

    private PanelsListItemCollection _Items;

    public PanelsListItemCollection Items
    {
        get { return _Items; }
        set { SetItems(value); }
    }

    private void SetItems(PanelsListItemCollection value)
    {
        if (_Items != value)
        {
            if (_Items != null) _Items.PanelsList= null;
            _Items = value;
            if (_Items != null) _Items.PanelsList= this;
        }
    }

Я предполагал, что после построения и добавления PanelsList в мою форму я смогу редактировать PanelsListItemCollection во время разработки.Но когда я нажимаю кнопку «...» в свойстве Items в редакторе Proeprties , открывается редактор Object Collection , но Add и Удалить кнопки отключены.

Когда я добавил свойство List<Control> Stuff { get; set; } к своему PanelsList, я мог добавлять и удалять элементы управления из Stuff во время разработки.Интересно, нужно ли мне реализовать IList вместо ICollection?

Редактировать: Я просто попытался также реализовать IList<PanelsListItem>, но это не помогло.

1 Ответ

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

Чтобы коллекция автоматически поддерживалась конструктором, он должен реализовывать неуниверсальный интерфейс IList - IList<T> не будет работать автоматически. Это связано с тем, что редактор коллекции по умолчанию основан на знании индекса каждого элемента. Другое требование совместимости с конструктором (которое уже удовлетворяет ваш код) заключается в том, что свойство, представляющее вашу коллекцию, должно иметь методы get и set; дизайнер делает временную копию вашей коллекции во время редактирования, а затем назначает ее свойству, когда пользователь нажимает кнопку ОК.

Если значение по умолчанию недостаточно, вы можете реализовать свой собственный редактор коллекций, расширив класс UITypeEditor (в пространстве имен System.Drawing.Design) и украсив свойство в своем коде с помощью EditorAttribute, например,

[Editor(typeof(MyCustomCollectionEditor), typeof(UITypeEditor))] 
public PanelsListItemCollection Items { /* ... */ }

Вы также можете расширить существующий класс CollectionEditor, но этот класс предоставляет только очень ограниченную функциональность производным классам.

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