C# 如何在';CollectionEditor';对话
请先阅读整个问题,了解我在哪里可以重置属性的默认值。 定义可以可视化设计的自定义类时,可以使用以下模式实现集合编辑器来修改列表、数组、集合等属性:C# 如何在';CollectionEditor';对话,c#,.net,winforms,windows-forms-designer,propertygrid,C#,.net,Winforms,Windows Forms Designer,Propertygrid,请先阅读整个问题,了解我在哪里可以重置属性的默认值。 定义可以可视化设计的自定义类时,可以使用以下模式实现集合编辑器来修改列表、数组、集合等属性: [Editor(typeof(CollectionEditor), typeof(UITypeEditor)), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public ElementCollection Elements { g
[Editor(typeof(CollectionEditor), typeof(UITypeEditor)),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ElementCollection Elements
{
get;
}
编辑此类的元素
属性现在将启动一个CollectionEditor
对话框,左侧是成员列表,右侧是PropertyGrid
问题是,此属性网格的上下文菜单似乎已禁用。因此,尽管定义了[DefaultValue]
属性,但我无法右键单击属性将其值“重置”为默认值
但是,DefaultValue
属性是可以识别的,因为该属性没有序列化(并且在网格中以未绑定的文本正确显示)
我想知道如何在CollectionEditor
对话框的PropertyGrid
上启用此上下文菜单:
或者,可以采用任何方式(热键等)重置这些集合项属性。您可以创建自己的集合编辑器继承类,然后重写方法,在集合编辑器窗体中查找属性网格,然后注册一个包含属性网格重置菜单项的
ContextMenuStrip
,然后使用以下方法重置属性:
公共类MyCollectionEditor:CollectionEditor
{
public MyCollectionEditor():base(typeof(Collection)){}
受保护的覆盖CollectionForm CreateCollectionForm()
{
var form=base.CreateCollectionForm();
var grid=form.Controls.Find(“propertyBrowser”,true).First()作为PropertyGrid;
var menu=new ContextMenuStrip();
添加(“重置”,null,(s,e)=>{grid.ResetSelectedProperty();});
//根据所选属性启用或禁用重置菜单
菜单打开+=(s,e)=>
{
如果(grid.SelectedGridItem!=null&&grid.SelectedObject!=null&&
grid.SelectedGridItem.PropertyDescriptor.CanResetValue(null))
menu.Items[0]。Enabled=true;
其他的
menu.Items[0]。Enabled=false;
};
grid.ContextMenuStrip=菜单;
申报表;
}
}
并通过以下方式装饰您的收藏财产:
[Editor(typeof(MyCollectionEditor), typeof(UITypeEditor))]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Collection<MyElement> MyElements { get; private set; }
[编辑器(typeof(MyCollectionEditor),typeof(UITypeEditor))]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
公共集合MyElements{get;private set;}
按照这种方法,您可以简单地添加分隔符、命令和描述菜单
[Editor(typeof(MyCollectionEditor), typeof(UITypeEditor))]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Collection<MyElement> MyElements { get; private set; }