2010-12-31 2 views
1

INotifyPropertyChanged를 사용할 때 좋은 질문에 대한 답이 더 많습니다.TypeDescriptor를 사용하여 INotifyPropertyChanged를 사용할 때 유효한 propertyName을 확인하십시오.

저는이 클래스가 대부분의 사용자 정의 뷰 모델 바인딩 환경에서 사용될 것이라는 의도로 INotifyPropertyChanged를 구현하는 기본 클래스를 만들었습니다.

기본적으로 속성 변경의 이름 (문자열)을 취하는 DispatchPropertyChange 메서드가 있습니다. 이것은 꽤 간단하지만 문자열은 분명히 오류가 발생하기 쉽습니다.

나는이 속성이 디스패치 전에 유효하다는 것을 확인하고 싶지만 이것이 좋은 접근 방법인지 확신 할 수 없습니다. 지금까지 도우미 기능은 이렇게 보입니다.

private void ValidateProperty(string prop) 
{ 
    if(TypeDescriptor.GetProperties(this)[prop] == null) 
    { 
     //throw error 
    } 
} 

나는이 전략이 문제를 늦출 수 있다고 생각합니다. 다른 접근법이나 속성 이름이 유효한지 확인하는 방법이 있습니까?

답변

2

INotifyPropertyChanged.PropertyChanged이라는 느슨한 형식의 문제를 처리하는 많은 구현 (보통 약간의 차이)이 있습니다.

부분 중 하나가 example 인 경우; 이는

protected void RaiseChanged<TProperty>(Expression<Func<TProperty>> propertyExpresion) 
{ 
    var property = propertyExpresion.Body as MemberExpression; 
    if (property == null || !(property.Member is PropertyInfo) || 
     !IsPropertyOfThis(property)) 
    { 
     throw new ArgumentException(string.Format(
      CultureInfo.CurrentCulture, 
      "Expression must be of the form 'this.PropertyName'. Invalid expression '{0}'.", 
      propertyExpresion), "propertyBLOCKED EXPRESSION; 
    } 

    this.OnPropertyChanged(property.Member.Name); 
} 
+0

이 재미있다 ... 나는 강한 입력 – Nicholas

+0

고려하지 않았다 컴파일 타임에 속성 이름 유효성 검사를 할 수있는 무엇 런타임에 propertyExpression 대리자를 분리하는 성능입니까? 강력한 타이핑은 항상 좋지만 ValidateProperty 메소드에서 ConditionalAttribute를 사용하여 릴리스 빌드에서 해제 할 수있는'TypeDescriptor.GetProperties' 검사보다 느린가? –

+0

@ David 개인적으로 벤치마킹 한 적이 없습니다. 그러나 나는 수많은 응용 프로그램에서 강력한 타이핑 접근법을 사용했고 결코 문제가 없었습니다. 내 생각 엔 모델/뷰 모델의 일반적인 풋 프린트로 인해 무시해도 좋을 것 같습니다. –

관련 문제