2011-02-10 5 views
0

나는 결코 wuth INotifyPropertyChanged를 사용하지 않습니다. 나는 기사를 읽고 거기에서 INotifyPropertyChanged와 관련된 코드를 발견했다.INotifyPropertyChanged에 대해서

public class ContactModel : INotifyPropertyChanged 
{ 
    private string _firstName; 

    public string FirstName 
    { 
     get { return _firstName; } 
     set 
     { 
      _firstName = value; 
      RaisePropertyChanged("FirstName"); 
      RaisePropertyChanged("FullName"); 
     } 
    } 

    private string _lastName; 

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

    public string FullName 
    { 
     get { return string.Format("{0} {1}", FirstName, LastName); } 
    } 



    protected void RaisePropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public override bool Equals(object obj) 
    { 
     return obj is ContactModel && ((ContactModel) obj).FullName.Equals(FullName); 
    } 

    public override int GetHashCode() 
    { 
     return FullName.GetHashCode(); 
    } 
} 

위 코드에서 RaisePropertyChanged ("FirstName"); 항상 속성 setter에서 호출됩니다. RaisePropertyChanged를 호출해야하는 이유. 좋은 설명을 위해 Google 검색하지만 좋은 링크를 찾지 못했습니다. 누군가 RaisePropertyChanged가 setter에서 호출해야하는 이유를 설명해 주시길 바랍니다.

감사

+0

일반적인 이벤트의 작동 방식을 알고 있습니까? –

답변

3

WPF는 PropertyChanged 이벤트에 등록하고이 즉 당신이 재산과 텍스트 상자에 텍스트 변경을 변경, 바인딩 작업을 할 것이기 때문에.

또한 이벤트 발생 패턴은 표준 이벤트입니다. 이벤트는 보호 된 메소드를 통해 발생되어 서브 클래스가 이벤트를 끄거나 동작을 변경할 수 있습니다.

나는 실제로 이름을 확인하는 내보기 모델에 좀 더이 - 원래 조쉬 스미스 :

public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string propertyName) 
    { 

     VerifyPropertyName(propertyName); 

     PropertyChangedEventHandler handler = this.PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    protected void OnPropertyChanged(object sender, string propertyName) 
    { 
     PropertyChanged(sender, new PropertyChangedEventArgs(propertyName)); 
    } 

    public void VerifyPropertyName(string propertyName) 
    { 

     if (TypeDescriptor.GetProperties(this)[propertyName] == null) 
     { 
      throw new Exception("Invalid property name: " + propertyName); 
     } 
    } 
속성이 실제로 이벤트를 rasing에 의해 다음, 변경하는 경우 당신은 속성 setter 내부 확인해야
2

 set 
     { 
      if (lastname != value) 
      { 
       _lastName = value; 
       RaisePropertyChanged("LastName"); 
       RaisePropertyChanged("FullName"); 
      } 
     } 

가입 한 모든 클래스을 t : 을 변경 당신의 속성이 그을 알릴 수 있습니다 그러면 PropertyChanged 이벤트에 속성이 변경되었음을 알리고 바인딩을 업데이트 할 수 있습니다.

+0

u가 고객 클래스라고 가정하고 name이라는 하나의 속성을 가지고 있고 해당 클래스의 객체를 만든 후 코드에서 이름을 변경하면 속성 만 변경됩니다. INotifyPropertyChanged 인터페이스와 관련된 몇 가지 코드를 읽은 후 이점은 속성이 변경된 호출 환경에 보고서를 호출하고 결과적으로 사용자가 속성 변경 후 이벤트에서 자신의 코드를 작성할 수 있음을 확인한 것입니다. 작은 샘플을 사용하여 – Thomas

1

구독하는 모든 수신자에게 속성이 변경되었다는 메시지가 표시되므로 적절하게 값을 업데이트해야합니다. 예를 들어, 격자가 텍스트를 변경합니다.

성도/이름 속성이 해당 사람의 전체 이름에 직접 영향을 주므로 바인딩에이 값이 반영되어야하기 때문에 FullName 속성도 업데이트 한 것입니다.

+0

을 사용하면 INotifyPropertyChanged 인터페이스를 사용하여 어떻게 이점을 얻을 수 있는지 보여주십시오. 속성이 변경되면 바인딩은 자동으로 변경 사항을 반영해야합니다. 그렇지 않으면 컨트롤에 변경 사항을 표시하도록 코드를 작성해야합니다. 감사 – Thomas