2012-04-29 1 views
1

내 응용 프로그램에서 PropertyGrid를 사용하고 있습니다. 런타임시 사용자 정의 데이터 기준에서 일부 속성에 대한 가시성 및 읽기 전용을 변경해야했습니다. 내가 뭔가 쉽게 & 준비 발견하지 않았지만속성 가져 오기가 호출 될 때 발생하는 이벤트 찾기

, 나는 다음과 같은 런타임에 ReadOnlyAttributeBrowsableAttribute 속성을 변경하여 해결 방법을 찾을 : 이제

protected void SetBrowsable(string propertyName, bool value) 
{ 
    PropertyDescriptor property = TypeDescriptor.GetProperties(GetType())[propertyName]; 
    BrowsableAttribute att = (BrowsableAttribute)property.Attributes[typeof(BrowsableAttribute)]; 
    FieldInfo cat = att.GetType().GetField("browsable", BindingFlags.NonPublic | BindingFlags.Instance); 

    if (property.Attributes.Cast<Attribute>().Any(p => p.GetType() == typeof(BrowsableAttribute))) 
     cat.SetValue(att, value); 
} 

protected void SetReadOnly(string propertyName, bool value) 
{ 
    PropertyDescriptor property = TypeDescriptor.GetProperties(GetType())[propertyName]; 
    ReadOnlyAttribute att = (ReadOnlyAttribute)property.Attributes[typeof(ReadOnlyAttribute)]; 
    FieldInfo cat = att.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); 

    if (property.Attributes.Cast<Attribute>().Any(p => p.GetType() == typeof(ReadOnlyAttribute))) 
     cat.SetValue(att, value); 
} 

, 내 문제는 내가 어디에해야이다 이 방법들을 부르시겠습니까? 이 메서드를 호출하기 위해 object을 처리 할 수있는 이벤트가 있습니까? 어쩌면 인터페이스를 구현할 수도 있습니다.

답변

1

property-get을 호출 할 때 발생하는 inbuilt 이벤트는 작성하지 않는 한 작성되지 않습니다. 사용자 정의 설명을 작성하는 경우 물론

, 당신은 (데이터 등, 바인딩) 기술자를 통해 액세스 을 차단하고, 당신이 원하는 무엇이든 할 수 있습니다 (PropertyDescriptor를, 일반적으로 장식과 반사 기술자 체인) -하지만 임의의 유형 (작성하지 않은 유형 포함).

런타임시 반영을 통한 속성 값 설정은 ... 좋지 않습니다. 이것은 주로 TypeDescriptor 캐싱의 실수로 작동합니다. 그렇게 할 경우 TypeDescriptor.AddAttributes (또는 유사)를 사용하는 것이 좋습니다. 그러나 사용자 정의 모델을 구현하여 수행하려는 작업을 훨씬 더 적절하게 수행 할 수 있습니다. 이 표시되는 위치에 따라이 하나에 의해 수행 할 수 있습니다

  • 이 GetProperties를 재정의, 사용자 지정 TypeConverter를 추가하고 데이터를 기반으로 런타임에 사용자 정의 설명을 제공 - PropertyGrid가
  • 구현은 ICustomTypeDescriptor 주로 작동 개체에서 GetProperties를 구현하고 데이터를 기반으로 런타임에 사용자 지정 설명자를 제공합니다. 대부분의 컨트롤에서 작동합니다.
  • 사용자 지정 TypeDescriptionProvider를 추가하고 위와 같이 동작하는 ICustomTypeDescriptor를 제공하여 형식 (TypeDescriptor.AddProvider)과 연결합니다. 이렇게하면 개체가 설명자 부두와 분리됩니다.

알리는 까다 롭습니다! 가장 쉬운 방법은 TypesConverter 옵션을 이용하는 것입니다.이 옵션은 PropertGrid를 언급하기 때문에 잘 작동합니다. ExpandableObjectConverter에서 상속 받아 GetProperties를 재정의하고 필요에 따라 필터링 한 다음 필요에 따라 읽기 전용 속성에 대한 사용자 정의 설명자를 제공하십시오. 그런 다음 사용자 지정 변환기 유형을 지정하여 TypeConverterAttribute를 유형에 연결하십시오.

강조 : .NET의이 지점은 꽤 복잡하고 모호하며 사용량이 줄어 듭니다. 그러나 그것은 효과적이다.