PropertyGrid - динамически изменяемый атрибут ReadOnlyAttribute - PullRequest
1 голос
/ 17 сентября 2009

Вздох, еще один вопрос PropertyGrid. Я думал, что смогу обойти это, пока не столкнусь с проблемой, когда не смогу ее избежать.

У меня есть логическое свойство, которое иногда должно быть доступно только для чтения, а иногда может изменяться в зависимости от объекта, выбранного в TreeView.

У меня вопрос, как я могу динамически изменять атрибут ReadOnlyAttribute свойства? Очевидно, что создание булевой переменной и затем попытка установить ее как ReadOnlyAttribute (boolVar) не работает, и теперь у меня нет идей.

Единственное решение, которое я могу придумать, - это создание отдельных, почти идентичных классов для элементов, для которых это свойство доступно для записи, и класса, доступного только для чтения, но мне это кажется немного нелегким.

Помощь? :)

Ответы [ 3 ]

3 голосов
/ 17 сентября 2009

Вы можете предоставить динамическую информацию о свойствах класса в сетку свойств, реализовав ICustomTypeDescriptor .

Сетка свойств вызовет ICustomTypeDescriptor.GetProperties () и вы вернете коллекцию объектов, полученных из PropertyDescriptors . В вашей реализации вы можете переопределить свойство PropertyDescriptor.IsReadOnly и реализовать свою логику.

Во-первых, это довольно сложная работа, но она дает вам возможность динамически возвращать имя и описание свойства (полезно для локализации), динамически помечать свойства как доступные только для чтения, динамически отображать и скрывать свойства и делать много других полезных вещей.

2 голосов
/ 17 сентября 2009

Что я хотел бы сделать, это создать базовый класс со свойством защищенной версии, а затем создать два класса, которые наследуют базовый класс, имеющий биты только для чтения и не только для чтения.

0 голосов
/ 18 сентября 2009

Вы можете попробовать что-то в этом духе, чтобы избежать преобразования типов, связанного с несколькими классами:

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;
            }
        }
    }
}
...