1

저는 데이터 바인딩을 처음 접했고 이해하기 힘든 오늘날 다음과 같은 기묘함이 있습니다 :.NET에서 INotifyPropertyChanged.PropertyChanged 이벤트 수신시 영향을받지 않는 속성 값을 읽는 이유는 무엇입니까?

두 개의 레이블 (labelA 및 labelB)과 두 개의 버튼 (buttonA 및 buttonB)이있는 양식이 있습니다.

두 개의 속성 (CountA 및 CountB)을 사용하여 양식 ("formState")을 호스팅합니다. labelA.Text는 formState.CountA에 데이터 바인딩되고, labelB.Text는 formState.CountB에 데이터 바인딩됩니다.

buttonA를 누르면 formState가 "CountA"를 속성 이름으로 사용하여 PropertyChange 이벤트를 발생시킵니다. buttonB를 누르면 formState.PropertyChange가 "CountB"로 설정된 속성 이름이됩니다.

buttonA를 누르면 labelA 만 업데이트되고 buttonB를 누르면 labelB 만 업데이트됩니다. 그러나 아무 버튼이나 누르면 레이블이 업데이트됩니다. CountA 및 CountB 속성이 증가하고 해당 값을 읽을 때마다 카운터를 반환하기 때문에이를 볼 수 있습니다. 아래 코드.

누구나이 동작에 대한 설명이 있습니까?

public partial class Form1 : Form 
{ 
    private FormState formState = new FormState(); 

    public Form1() 
    { 
     InitializeComponent(); 

     labelA.DataBindings.Add(
      new Binding("Text", formState, "CountA")); 

     labelB.DataBindings.Add(
      new Binding("Text", formState, "CountB")); 
    } 

    private void buttonA_Click(object sender, EventArgs e) 
    { 
     formState.raisePropertyChangedEvent("CountA"); 
     // both labelA and labelB get updated - why not just labelA? 
    } 

    private void buttonB_Click(object sender, EventArgs e) 
    { 
     formState.raisePropertyChangedEvent("CountB"); 
     // both labelA and labelB get updated - why not just labelB? 
    } 

    public class FormState : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     private int countA = 0; 
     private int countB = 0; 

     public int CountA 
     { 
      get { return ++countA; } 
     } 

     public int CountB 
     { 
      get { return ++countB; } 
     } 

     public void raisePropertyChangedEvent(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

답변

3

관찰 가능한 개체의 순 소비자 일 수 있습니다. INotifyPropertyChangedObjects의 단순한 소비자는 속성 이름을 무시하고 모든 것을 재평가 할 수 있습니다. 다음과 같은 클래스를 상상해보십시오 :

+0

완전히 그런 것 같지 않습니다. 유효하지 않은 속성 이름을 사용하여 PropertyChanged 이벤트를 발생시키고 내 레이블을 업데이트하지 않았습니다. 그러나 나는 또한 속성 이름으로 'null'을 사용하여이를 테스트했습니다. 다시 두 레이블을 모두 업데이트했습니다. 어떤 경우 든 내 코드에 문제가 있지 않으면 데이터 바인딩 된 .NET 컨트롤이 예상대로 PropertyChanged 이벤트에 반응하지 않는다는 것을 의미합니다. 복잡한 데이터 바인딩 된 사용자 인터페이스의 경우 모든 데이터가 변경됩니다 전체 사용자 인터페이스가 업데이트됩니다. 꽤 비효율적 인 것 같습니다. –

1

클래스의 책임은 변경 알림 -이를 처리하는 방법을 결정하는 소비자의 책임입니다. 변경된 모든 속성의 모든 속성을 검사하도록 선택하면이를 수행 할 수 있습니다.