postsharp와 같은 것을 사용하지 않고 사용하는 최소 버전은 다음과 같은 것을 사용합니다.
public class Data : INotifyPropertyChanged
{
// boiler-plate
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
protected bool SetField<T>(ref T field, T value, string propertyName)
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}
// props
private string name;
public string Name
{
get { return name; }
set { SetField(ref name, value, "Name"); }
}
}
각 속성은 다음과 같습니다.
private string name;
public string Name
{
get { return name; }
set { SetField(ref name, value, "Name"); }
}
크지 않은; 원하는 경우 기본 클래스로 사용할 수도 있습니다. 에서 bool
반환 SetField
하면 다른 논리를 적용하려는 경우 비 작동인지 알려줍니다.
또는 C # 5를 사용하면 더 쉽습니다.
protected bool SetField<T>(ref T field, T value,
[CallerMemberName] string propertyName = null)
{...}
다음과 같이 호출 할 수 있습니다 :
set { SetField(ref name, value); }
컴파일러가 "Name"
자동으로 추가합니다 .
C # 6.0을 사용하면 구현이 더 쉬워집니다.
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
... 그리고 이제 C # 7로 :
protected void OnPropertyChanged(string propertyName)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
protected bool SetField<T>(ref T field, T value,[CallerMemberName] string propertyName = null)
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}
private string name;
public string Name
{
get => name;
set => SetField(ref name, value);
}