2011-10-17 2 views
0

(.Net 3.5 사용) 외부 데이터 소스에서 설정을 가져 오는 루틴이 있는데, 그 후에 어떤 속성이 업데이트되었는지 자세히 설명하는 사용자에게 의사 로그를 표시해야합니다. 보통 property_changed 이벤트를 통해 속성 업데이트를 추적합니다. 그러나 데이터 소스의 값이 이미 속성 값과 같으면 속성 집합이 호출 된 경우에도 property_changed 이벤트가 발생하지 않습니다. 하지만 여전히 데이터 소스에서 "업데이트"된 것과 같은 속성을 사용자에게 표시해야합니다."시도"속성 변경에 대한 이벤트

일반적인 패턴은 무엇입니까? 내 속성 setters- "property_attemptedset"에 다른 이벤트가 필요합니까 (property_changed 추가)?

편집 : 그래서 한 가지 제안은 속성 설정자에서 평등 확인을 수행하지 않으므로 "property_changed"가 무엇이든 상관없이 실행된다는 것입니다. 그러나 나는 항상 실제 가치 변화를 걸러 내라는 말을 들었다. 그게 최선의 관행이 아닌가?

+0

내 대답이 확장되었습니다. – RoelF

답변

1

는이처럼 속성을 작성하는 경우 : 그것은 항상 값이 같은 경우에도 PropertyChanged -event를 해고해야

public string LastName{ 
    get { return lastName; } 
    set { 
     lastName = value; 
     RaisePropertyChanged("LastName"); 
    } 
} 

. 이를 위해 추가 이벤트를 발생시킬 필요가 없습니다.

편집 당신의 편집에 추가

: 예, 실제 값의 변화를 확인하기 위해 가장 좋은 방법은 생각하지만, 시나리오가 아닌 값의 변경 사항을 추적 할 필요가있는 경우, 당신 왜 표시되지 않습니다 그것을 바꿀 수는 없다. "모범 사례"는 "규칙 위반 및 규칙 위반"을 의미하지 않습니다. 당신 같은
그러나 경우에 이러한 클래스는 또한 일반적인하여 PropertyChanged 동작에 의존하는 다른 관찰자가, 당신은 항상 속성을 확장하고 다른 (사용자 정의)를 던질 수있는이 이벤트는 언급 :

public event PropertyChangedEventHandler AttemptedPropertyChanged; 
    public void RaiseAttemptedPropertyChanged(string propName) 
    { 
     if (AttemptedPropertyChanged != null) 
     { 
      AttemptedPropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 


    public string LastName{ 
     get { return lastName; } 
     set {     
      RaiseAttemptedPropertyChanged("LastName"); 
      if (lastName == value) return; 
      lastName = value; 
      RaisePropertyChanged("LastName"); 
     } 
    } 
2

글쎄, 그것은 꽤 흔한 일 실제로 속성 값을 변경하지 않을 때 PropertyChanged 이벤트를 발생시키지 않도록해야합니다.하지만 반드시해야한다는 규칙은 없습니다. 현재 값에 대해 새 값을 검사하는 설정자의 모든 논리를 제거하면됩니다.

+0

예 실제로 변경되지 않는 한 항상 PropertyChanged 이벤트를 발생시키지 않도록해야했습니다. 코드에 실제로 영향을 미치지 않는다고 확신합니까? 그리고 그것이 아무런 차이가 없다면 왜 우리는 그런 식으로해야할까요? – Tekito

+0

속성 변경 여부와 관계없이 모든 변경 처리 코드가 실행될 것입니다 (그리고 UI를 업데이트해야 함). 당신이 그 성과를 받아 들일 용의가 있다면, 그 다음에 진행하십시오. – canon

1

때로는 변경을 방지하기 위해 작성한 내용에 기반한 다음 단계처럼 들립니다. 그렇다면 BeforePropertySet과 같은 새 이벤트를 도입하고 취소 할 수있는 이벤트 객체를 전달합니다.

이것은 모범 사례를 유지합니다. 언젠가 누군가가 일상적으로 propertychanged를 사용하고 코드가 작동하지 않는 이유를 알아낼 수 없게되는 상황을 예방하고, 자신이하는 일을 분명히하며, 별도의 우려가 조금 더 나아졌습니다.