2

我有一个包含一些公共字段的类,我想在表单上的 PropertyGrid 中显示这些字段:

public class FileInfo
{
     ...

     [DisplayName("Messages")]
     public Collection<MessageInfo> MessageInfos { get; set; }
}

问题是我还想为此类的某些实例禁用 Collection,因此用户甚至无法进入其编辑器。而且我需要从代码中制作它,而不是从设计师那里。

即使我通过添加属性 [ReadOnly(true)] 使该字段为只读,它也将允许用户通过按 (...) 进入其编辑器:

在此处输入图像描述

4

4 回答 4

2

如果您定义一个覆盖标准CollectionEditor的自定义UITypeEditor ,则可以这样做,如下所示:

    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);
        }
    }
于 2013-04-08T07:16:26.323 回答
0

添加一个布尔标志,指示该集合是否为只读:

public class FileInfo
{
    ...

    [DisplayName("Messages")]
    public Collection<MessageInfo> MessageInfos { get; set; }
    public bool IsReadOnly;
}

为您要禁用的实例设置IsReadOnly为。true然后,您可以根据标志的状态启用/禁用您的 UI。

于 2013-04-08T03:36:13.500 回答
0

取决于您的程序的设计。您可以使用继承。您并没有真正提供有关谁可以访问您的对象的信息……等等。由于缺乏其他细节,因此它需要在代码中而不是设计器中,这是一个简单的解决方案。或者你可能需要更强大的东西。

public class FileInfo
{
     //...
}

public class FileInfoWithCollection : FileInfo {
     [DisplayName("Messages")]
     public Collection<MessageInfo> MessageInfos { 
          get; 
          set;
     }    
}

另一种选择可能是滚动您自己的继承副本,Collection该副本覆盖任何可以修改集合的方法。如果没有更多信息,并且集合是 ref 类型,我怀疑你会得到一个肯定的答案。

于 2013-04-08T04:10:52.437 回答
0

在属性顶部添加 ReadOnly 属性。

[DisplayName("Messages")]
[ReadOnly(true)]
public Collection<MessageInfo> MessageInfos { get; set; }

还没测试,希望能用。

取自此链接

于 2013-04-08T04:11:28.750 回答