2017-10-30 3 views
1

I가 다음과 같은 클래스데이터 바인딩 그 Concats이 변수

public abstract class Contact 
{ 
    public abstract string FullName { get; } 
    public abstract string FullName_LastNameFirst { get; } 
} 

public class PersonContact 
{ 
    private string firstName; 
    private string lastName; 

    public override string FullName => firstName + " " + lastName; 
    public override string FullName_LastNameFirst => lastName + ", " + firstName; 
} 

public class BusinessContact 
{ 
    private string name; 

    public override string FullName => name; 
    public override string FullName_LastNameFirst => name; 
} 

이 클래스에서 INotifyPropertyChanged를 (도시하지 않음) 확장 OnPropertyChanged를 트리거 private 변수를 포장 공용 속성을 포함한다.

질문은 WPF에서 FullName 또는 FullName_LastNameFirst 속성에 바인딩하는 경우 어떻게 래핑하는 속성 중 하나가 변경 될 때 업데이트 할 수 있습니까? 당신이 기본 private 필드 (BusinessContact에서 firstName, lastName 또는 name)를 변경하는 경우

답변

2

- 개체의 PropertyChanged 이벤트에 등록됩니다 바인딩

OnPropertyChanged("FullName"); 
OnPropertyChanged("FullName_LastNameFirst"); 

WPF 데이터를 호출하고 속성을 대응하는 변경 알림을들을 것입니다. 속성에는 OnPropertyChanged으로 전화 할 수있는 설정자가 없으므로 기본 데이터가 변경되면 명시 적으로 호출해야합니다.

0

당신은 반드시 귀하의 인물에 대한 속성이 있어야합니다. 당신이 뒤따라야 속성이있는 경우 당신은 그것을 좋아 구현할 수 있습니다 : 당신이 볼 수 있듯이 뒤따라야의 값이 변경되면

private string _ForeName; 

public string ForeName 
{ 
    get 
    { return _ForeName; } 
    set 
    { 
     if (_ForeName != value) 
     { 
      _ForeName = value; 
      OnPropertyChanged(nameof(this.ForeName)); 
      OnPropertyChanged(nameof(this.FullName)); 
     } 
    } 
} 

가하는하여 PropertyChanged 이벤트가 발사됩니다. LastName 속성을 비슷하게 만들 수 있습니다. 당신이 클래스를 생성 한 경우

public Person() 
{ 
    this.PropertyChanged += this.Person_PropertyChanged; 
} 

private void Person_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == nameof(LastName)) 
    { 
     this.OnPropertyChanged(nameof(FullName)); 
    } 
    if (e.PropertyName == nameof(ForeName)) 
    { 
     this.OnPropertyChanged(nameof(FullName)); 
    } 
} 

이 두 번째 솔루션은 유용하며,이 속성 세터를 변경할 수 없습니다 : 사람 클래스 자체하여 PropertyChanged 수신하는 경우

타 솔루션이다. 그런 다음 부분 클래스를 만들고 속성 변경 사항을 처리 할 수 ​​있습니다.

0

Evk 및 lvoros의 답변은 기술적으로 정확합니다.

그러나 Fody ProperyChanged 라이브러리 (Nuget에서 사용 가능)를 사용하면이 상용구 코드를 모두 작성하지 않아도됩니다.

클래스는

public class Person : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public string GivenNames { get; set; } 
    public string FamilyName { get; set; } 
    public string FullName => $"{GivenNames} {FamilyName}"; 
} 

로 작성 실제로 직접 속성 래퍼 외에 종속 계산 된 속성()를 호출 자동으로 OnPropertyChanged를 생성합니다

public class Person : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    string givenNames; 
    public string GivenNames 
    { 
     get => givenNames; 
     set 
     { 
      if (value != givenNames) 
      { 
       givenNames = value; 
       OnPropertyChanged("GivenNames"); 
       OnPropertyChanged("FullName"); 
      } 
     } 
    } 

    string familyName; 
    public string FamilyName 
    { 
     get => familyName; 
     set 
     { 
      if (value != familyName) 
      { 
       familyName = value; 
       OnPropertyChanged("FamilyName"); 
       OnPropertyChanged("FullName"); 
      } 
     } 
    } 

    public string FullName => $"{GivenNames} {FamilyName}"; 

    public virtual void OnPropertyChanged(string propertyName) 
    { 
     var propertyChanged = PropertyChanged; 
     if (propertyChanged != null) 
     { 
      propertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Fody로 컴파일됩니다.

나는 보통 "마법"에 의해 작동하는 프로그램의 팬이 아니지만 Fody는 나의 하나의 예외입니다.