如何在“CollectionEditor”对话框中为属性启用默认值

时间:2016-02-19 23:53:16

标签: c# .net winforms windows-forms-designer propertygrid

请先阅读整个问题以了解 我可以重置属性的默认值。

定义可视化设计的自定义类时,可以使用以下模式实现集合编辑器以修改列表,数组,集合等属性:

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

现在,编辑此类的Elements属性将启动CollectionEditor对话框,左侧是成员列表,右侧是PropertyGrid

问题是,似乎已禁用此属性网格的上下文菜单。因此,我无法右键单击属性以将其值“重置”为默认值,尽管{{1}定义了属性。

然而,[DefaultValue]属性被识别,因为该属性未被序列化(并且在网格中的非压缩文本中正确显示)。

我想知道如何在DefaultValue对话框的PropertyGrid上启用此上下文菜单

enter image description here

或者,可以实现任何方式(热键,)以重置这些集合项属性。

1 个答案:

答案 0 :(得分:2)

您可以创建自己的集合编辑器继承CollectionEditor类,然后覆盖CreateCollectionForm方法,在集合编辑器表单中查找属性网格,然后注册包含重置的ContextMenuStrip 属性网格的菜单项,然后使用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; }

按照这种方法,您只需添加分隔符,命令和说明菜单即可。

相关问题