1

叹息,另一个 PropertyGrid 问题。我以为我可以解决这个问题,直到遇到一个我实际上无法避免的问题。

我有一个布尔属性,有时需要只读,有时需要根据从 TreeView 中选择的对象进行更改。

我的问题是如何动态更改属性的 ReadOnlyAttribute?显然,创建一个布尔变量然后尝试像 ReadOnlyAttribute(boolVar) 一样设置它是行不通的,现在我没有想法了。

我能想到的唯一解决方案是为该属性可写和只读的项目创建单独的、几乎相同的类,但这对我来说似乎有点不雅。

帮助?:)

4

3 回答 3

3

您可以通过实现ICustomTypeDescriptor向属性网格提供有关类属性的动态信息。

属性网格将调用ICustomTypeDescriptor.GetProperties()并返回从PropertyDescriptors派生的对象集合。在您的实现中,您可以覆盖PropertyDescriptor.IsReadOnly属性并实现您的逻辑。

首先这是一项相当多的工作,但它使您可以动态返回属性名称和描述(有助于本地化),动态将属性标记为只读,动态显示和隐藏属性,以及做很多事情其他有用的东西。

于 2009-09-17T19:47:57.023 回答
2

我要做的是创建一个具有受保护版本属性的基类,然后创建两个继承具有只读和非只读位的基类的类。

于 2009-09-17T19:44:34.010 回答
0

您可以尝试以下方式来避免涉及多个类的类型转换:

class TestClass
{
    private bool isMyPropertyReadOnly;

    public bool IsMyPropertyReadOnly
    {
        get { return isMyPropertyReadOnly; }
        set { isMyPropertyReadOnly = value; }
    }

    private int myVar;

    public int MyProperty
    {
        get { return myVar; }

        set
        {
            if (isMyPropertyReadOnly)
            {
                throw new System.Exception("The MyProperty property is read-only.");
            }
            else
            {
                myVar = value;
            }
        }
    }
}
于 2009-09-17T20:00:46.107 回答