PropertyGrid — динамически изменяющийся ReadOnlyAttribute
-
10-07-2019 - |
Вопрос
Эх, еще один вопрос по 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;
}
}
}
}