2009-09-17 6 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; 
      } 
     } 
    } 
} 
관련 문제