c# - 如何在 'CollectionEditor' 对话框中启用属性的默认值

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

请先阅读整个问题,了解在哪里我能够重置属性的默认值。

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

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

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

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

但是,DefaultValue 属性已被识别,因为该属性未序列化(并且在网格内以非粗体文本正确显示)。

我想知道如何从 CollectionEditor 对话框中在 PropertyGrid 上启用此上下文菜单:

enter image description here

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

最佳答案

您可以创建自己的集合编辑器继承 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; }

按照这种方法,您可以简单地添加分隔符、命令和描述菜单。

关于c# - 如何在 'CollectionEditor' 对话框中启用属性的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35517211/

相关文章:

c# - 线程的执行上下文

c# - 视觉 C# : How do I attach a click event to an item in listbox?

.net - 使用 YES/NO 值将复选框绑定(bind)到数据表

C# DataGridView Checkbox 勾选事件

c# - 将多个列表绑定(bind)到 DataGridView

c# - 试图获取表示类层次结构的字符串

c# - 构造函数中的数据验证

.net - Entity Framework 错误: The ObjectContext instance has been disposed and can no longer be used for operations that require a connection

c# - 不允许控制台打印任何键并仅将箭头作为输入

c# - 在 Windows 应用程序中以编程方式选择 TreeView 中的节点