2016-02-19 2 views
2

Пожалуйста, сначала прочитайте весь вопрос, чтобы понять где У меня была бы возможность сбросить значение свойства по умолчанию.Как включить значения по умолчанию для свойств в диалоговом окне 'CollectionEditor'

При определении пользовательского класса, который может быть визуально разработан, можно реализовать редактор коллекции для изменения свойств, которые являются списки, массивы, коллекции, используя следующую закономерность:

[Editor(typeof(CollectionEditor), typeof(UITypeEditor)), 
    DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
public ElementCollection Elements 
{ 
    get; 
} 

Редактирование Elements свойство этот класс теперь запустит диалог CollectionEditor, со списком участников слева и PropertyGrid справа.

Проблема заключается в том, что контекстные меню отключены для этой сетки свойств. Поэтому я не могу щелкнуть правой кнопкой мыши свойство, чтобы «сбросить» его значение до значения по умолчанию, несмотря на то, что атрибут [DefaultValue] определен.

Атрибут DefaultValue признан, поскольку свойство не сериализуется (и корректно отображается в нерасширенном тексте в сетке).

Я хотел бы знать, как включить это контекстное меню на PropertyGrid из CollectionEditor диалога:

enter image description here

или альтернативно, любым способом (горячая клавиша, и т.д.), который может чтобы быть в состоянии сбросить эти свойства элемента коллекции.

ответ

2

Вы можете создать свой собственный редактор коллекции наследующего CollectionEditor класса, а затем переопределить CreateCollectionForm метод, найти свойство сетки в виде коллекции редактора, а затем зарегистрировать ContextMenuStrip, содержащим Reset пункта меню для свойства сетки, а затем сбросить свойство с помощью ResetSelectedProperty :

public class MyCollectionEditor : CollectionEditor 
{ 
    public MyCollectionEditor() : base(typeof(Collection<MyElement>)) { } 
    protected override CollectionForm CreateCollectionForm() 
    { 
     var form = base.CreateCollectionForm(); 
     var grid = form.Controls.Find("propertyBrowser", true).First() as PropertyGrid; 
     var menu = new ContextMenuStrip(); 
     menu.Items.Add("Reset", null, (s, e) => { grid.ResetSelectedProperty(); }); 
     //Enable or disable Reset menu based on selected property 
     menu.Opening += (s, e) => 
     { 
      if (grid.SelectedGridItem != null && grid.SelectedObject != null && 
       grid.SelectedGridItem.PropertyDescriptor.CanResetValue(null)) 
       menu.Items[0].Enabled = true; 
      else 
       menu.Items[0].Enabled = false; 
     }; 
     grid.ContextMenuStrip = menu; 
     return form; 
    } 
} 

И украсить вашу собственность коллекции так:

[Editor(typeof(MyCollectionEditor), typeof(UITypeEditor))] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
public Collection<MyElement> MyElements { get; private set; } 

Следуя этому подходу, вы можете просто добавить разделитель, команды и описания.

+1

Блестящее решение! – Lemonseed

 Смежные вопросы

  • Нет связанных вопросов^_^