Please read entire question first to understand where I would have the ability to reset the default value of a property.
When defining a custom class that can be visually designed, one can implement a collections editor to modify properties which are lists, arrays, collections, using the following pattern:
[Editor(typeof(CollectionEditor), typeof(UITypeEditor)),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ElementCollection Elements
{
get;
}
Editing the Elements property of this class will now launch a CollectionEditor dialog, with a list of members on the left and a PropertyGrid on the right.
The problem is, it appears that context menus are disabled for this property grid. Therefore, I cannot right click on a property to 'reset' its value to default, despite having a [DefaultValue] attribute defined.
Yet, the DefaultValue attribute is recognized, because the property is not serialized (and correctly displayed in unbolded text within the grid).
I would like to know how to enable this context menu on the PropertyGrid from the CollectionEditor dialog:
or alternatively, any way (hot key, etc.) that can be implemented to be able to reset these collection item properties.
You can create your own collection editor inheriting CollectionEditor class and then override CreateCollectionForm method, find property grid in the collection editor form and then register a ContextMenuStrip containing a Reset menu item for property grid, then reset the property using 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;
}
}
And decorate your collection property this way:
[Editor(typeof(MyCollectionEditor), typeof(UITypeEditor))]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Collection<MyElement> MyElements { get; private set; }
Following this approach you can simply add a separator, commands and description menus.
来源:https://stackoverflow.com/questions/35517211/how-to-enable-default-values-for-properties-in-a-collectioneditor-dialog
