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

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

我的问题是如何动态更改属性的ReadOnlyAttribute?显然,创建一个布尔变量,然后尝试将其设置为ReadOnlyAttribute(boolVar)不起作用,现在我没有想法。

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

帮助? :)

有帮助吗?

解决方案

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

其他提示

您可以通过实现 ICustomTypeDescriptor

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

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

您可以尝试这些方面的内容,以避免涉及多个类的类型转换:

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;
            }
        }
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top