postharpのようなものを使用せずに、私が使用する最小バージョンは次のようなものを使用します。
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);
}
また、C#8とNullable参照型を使用すると、次のようになります。
public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = "")
{
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);
}