2017-09-20 11 views
0

내 View 모델에서보기에서 참조하는 여러 개의 읽기 전용 속성이 있으며 그 중 일부는 하나 이상의 다른 읽기 전용 속성 (동일한 View Model) 하나 이상의 읽기/쓰기 속성 (동일한보기 모델에서)에 궁극적으로 의존합니다. 나는 단지 잠재적으로 영향을받는 모든 속성에 대해 PropertyChanged 이벤트가 발생했는지 확인하기 위해 샘플에서 다음 패턴을 보았지만 모든 RaisePropertyChanged 호출을 복제하는 것을 좋아하지 않습니다.계단식 읽기 전용 속성의 중복 RaisePropertyChanged 방지

은 내가 대신에 의존하는 속성을 가지고 각 속성에 대한, 내보기 모델의 PropertyChanged 이벤트로 그 핸들러에 핸들러를 추가해야한다 의심 만 등록 직접 (대 또한 사람에 RaisePropertyChanged 전화 그 간접적으로)는 해당 속성에 따라 다릅니다. RaisePropertyChanged Call을 모두 복제하지 않으려면 어떻게해야합니까?

public bool MyReadOnlyPropertyAA1 
{ 
    get 
    { 
     return MyReadOnlyPropertyA1 [&& MyReadOnlyPropertyB1 ...] 
    } 
} 


public bool MyReadOnlyPropertyA1 
{ 
    get 
    { 
     return (MyPropertyA == (Some Value)) [&& MyPropertyB == (Some Other Value)) ... ] 
    } 
} 

public MyPropertyAType MyPropertyA 
{ 
    get 
    { 
     return myPropertyA 
    } 
    set 
    { 
     myPropertyA = value; 
     RaisePropertyChanged(nameof(MyPropertyA)); 
     RaisePropertyChanged(nameof(MyReadOnlyPropertyA)); 
     RaisePropertyChanged(nameof(MyReadOnlyPropertyA1)); 
     RaisePropertyChanged(nameof(MyReadOnlyPropertyAA1)); 
     ... 
     RaisePropertyChanged(nameof(MyReadOnlyPropertyAA...1)); 
    } 
} 


public MyPropertyBType MyPropertyB 
{ 
    get 
    { 
     return myPropertyB 
    } 
    set 
    { 
     myPropertyB = value; 
     RaisePropertyChanged(nameof(MyPropertyB)); 
     RaisePropertyChanged(nameof(MyReadOnlyPropertyA)); 
     RaisePropertyChanged(nameof(MyReadOnlyPropertyA1)); 
     RaisePropertyChanged(nameof(MyReadOnlyPropertyAA1)); 
     ... 
     RaisePropertyChanged(nameof(MyReadOnlyPropertyAA...1)); 
    } 
} 
+0

_read-only_properties에 대한 실행 속성 변경 이벤트는 어리 석음의 높이입니다. 코드의 사용자에게 속성이 읽기 전용이라는 인상을 주면 그대로 두십시오. 다른 속성을 변경하면 디자인에 영향을 미치지 않아야합니다. – MickyD

+2

@MickyD 속성이 읽기 전용이기 때문에 속성 값이 일정하다는 의미는 아닙니다. 단지 세터를 통해 속성을 수정할 수 없다는 것을 의미합니다. – Iqon

+0

당신이 원하는 것을 성취 할 수있는 방법은 여러 가지가 있지만, 거의 모두 당신이 피하려고하는 것과 못 생겼습니다. 바인딩/다중 바인딩 및 변환기를 사용하는 대신 읽기 전용 속성을 만드는 것이 전부입니다. – CrudaLilium

답변

3

속성 관계에 따라 두 가지 방법을 사용합니다.

하나의 속성을 변경하면 다른 속성이 변경되는 것은 당연한 일이며, 속성 변경 코드는 설정자에게 맡깁니다.

private void MyClass_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    switch(e.PropertyName) 
    { 
     case "PropertyA": 
      RaisePropertyChanged(nameof(PropertyB)); 
      break; 
    } 
} 

그 이유는 내가 내 재산 세터에서 특별한 논리를 원하지 않을 것입니다 : 두 속성이 논리적으로 관련이없는 경우

public string PropertyA 
{ 
    get { return propertyA; } 
    set 
    { 
     myPropertyA = value; 
     RaisePropertyChanged(nameof(PropertyA)); 
     RaisePropertyChanged(nameof(IsPropertyAValid)); 
     ... 
    } 
} 

그러나, 나는이의 PropertyChange 핸들러를 사용합니다. 나에게 꽤 일반적이고, #region 태그에 머물러 있고, 붕괴되어 잊혀져 야한다.

두 속성이 논리적으로 관련되어 있고 하나의 속성을 변경하면 다른 값이 변경 될 수 있으므로 RaisePropertyChange 코드를 설정자에 남겨 둘 수 있습니다.

하지만 서로 다르면 미래에 나 자신이나 다른 개발자가 코드를보고 잠재적으로이 두 가지 사이에 종속 관계가 있음을 알지 못하거나 이해할 수 없으므로 클래스의 PropertyChange 이벤트 처리기에 변경 사항을 넣습니다. 필요한 경우 쉽게 찾고 변경할 수 있습니다.

+0

우선, 한숨, 유감스럽게도 유감스럽게도, IMHO가 존경받는 답이 될 수 있도록 Downvoted를 받아야했습니다. 나는 Downvotes가 * 악의적으로 * 나쁜 질문, 코멘트 및 답변을 위해 예약되어야한다고 생각합니다. 그렇지 않으면, Upvotes가 부족하거나 적은 것을 상상해보십시오 (즉, Positive vs. Negative reinforcement). 다른 답변을 얻었는지 확인하기 위해 응답으로 표시하는 것을 연기 할 것입니다. FWIW, 나는 그것을 업 그레 이드 했으므로 (적어도 과거/미래의 희망을 갖고있는) 다운 보트 중 적어도 하나를 상쇄 할 것이다. – Tom

+0

두 번째 생각에 읽기 전용 속성이 읽기/쓰기 속성에서 단 한 수준 만 제거 된 경우 (읽기/쓰기 속성에서 설정이 완료되었는지 여부는 RaisePropertyChange 호출과 동일합니다) 또는 속성 변경 이벤트 처리기. Read-Only Properties가 2 단계 이상 제거 된 경우, Read/Write Properties Setters에서 복제가 도입됩니다. 그것들은 내가 묻고있는 시나리오들이다. – Tom

+0

이전 질문에서 언급했듯이, 다른 사람에게 응답하는 Q에 대한 논평에서 중복을 피하는 것 외에도 RaisePropertyChange 's를 Property Setter 외부의 * Dependent * Properties로 옮기는 또 다른 이유는 IMHO가 문제가되는 것을 피하는 것입니다 그것 SoC 또는 무엇이든) PropertyChanged 이벤트가 제기되는 속성은 해당 속성을 발생시키는 속성의 "종속성"이 아닌 "종속물"입니다. 이러한 속성은 ViewModel 속성과 마찬가지로 "종속 항목"이 무엇인지 모를 것입니다. 어떤 뷰 요소가 ViewModel 속성에 의존하는지 알 수 없습니다. 그것에 대한 당신의 생각은 무엇입니까? – Tom