我有一个包含一些公共字段的类,我希望在表单上的PropertyGrid中显示这些字段:
public class FileInfo
{
...
[DisplayName("Messages")]
public Collection<MessageInfo> MessageInfos { get; set; }
}
问题是我还想为这个类的某些实例禁用Collection,因此用户甚至无法进入其编辑器。我需要从代码中创建它,而不是从设计器中创建它。
即使我通过添加属性[ReadOnly(true)]创建此字段ReadOnly,它也允许用户通过按(...)进入其编辑器:
答案 0 :(得分:2)
如果您定义的是覆盖标准UITypeEditor的自定义CollectionEditor,则可以执行此操作,如下所示:
public class FileInfo
{
[DisplayName("Messages")]
[Editor(typeof(MyCustomCollectionEditor), typeof(UITypeEditor))]
public Collection<MessageInfo> MessageInfos { get; set; }
}
public class MyCustomCollectionEditor : CollectionEditor // needs a reference to System.Design.dll
{
public MyCustomCollectionEditor(Type type)
: base(type)
{
}
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
if (DontShowForSomeReason(context)) // you need to implement this
return UITypeEditorEditStyle.None; // disallow edit (hide the small browser button)
return base.GetEditStyle(context);
}
}
答案 1 :(得分:0)
添加一个布尔标志,指示集合是否为只读:
public class FileInfo
{
...
[DisplayName("Messages")]
public Collection<MessageInfo> MessageInfos { get; set; }
public bool IsReadOnly;
}
将IsReadOnly
设置为true
以查找要禁用的实例。然后,您可以根据标志的状态启用/禁用UI。
答案 2 :(得分:0)
取决于您的计划的设计。你可以使用继承。你没有真正提供有关谁有权访问你的对象等信息。由于缺乏其他细节,它需要在代码中而不是设计者这是一个简单的解决方案。或者你可能需要更强大的东西。
public class FileInfo
{
//...
}
public class FileInfoWithCollection : FileInfo {
[DisplayName("Messages")]
public Collection<MessageInfo> MessageInfos {
get;
set;
}
}
另一个选项可能是滚动您自己的Collection
的继承副本,该副本会覆盖任何可能修改集合的方法。如果没有更多的信息,并且集合是一个参考类型的事实,我怀疑你会得到一个肯定的答案。
答案 3 :(得分:0)
在属性顶部添加ReadOnly属性。
[DisplayName("Messages")]
[ReadOnly(true)]
public Collection<MessageInfo> MessageInfos { get; set; }
尚未测试,希望它有效。
取自this link。