2009-09-17 3 views
1

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

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

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

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

Помощь? :)

ответ

2

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

3

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

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

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

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; 
      } 
     } 
    } 
} 
Смежные вопросы