Вопрос

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

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

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

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

Помощь?:)

Это было полезно?

Решение

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

Другие советы

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

Сетка свойств вызовет ICustomTypeDescriptor.GetProperties() и вы возвращаете коллекцию объектов, полученных из Дескрипторы свойств.В вашей реализации вы можете переопределить 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