Этот ответ очень похож на ответ Джо Уайта, приведенный выше, но код немного более краткий и, возможно, немного более понятный, поскольку имена свойств не нужно передавать в виде строки в кавычках.
Используя функциональность CallerMemberName , можно сделать это двумя способами. Одним из них является создание абстрактного класса, который содержит код IPropertyNotifyChanged , а другой подход - включение кода поддержки IPropertyNotifyChanged в текущий класс. Я обычно использую оба в зависимости от контекста.
Вот как выглядят результаты при использовании абстрактного класса:
public abstract class PropertyNotifier: INotifyPropertyChanged
{
#region INotifyPropertyChanged support code
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
protected bool SetProperty<T>(ref T storage, T value,
[CallerMemberName] String propertyName = null)
{
bool result = false;
if (!Object.Equals(storage, value))
{
storage = value;
OnPropertyChanged(propertyName);
result = true;
}
return result;
}
#endregion INotifyPropertyChanged support code
}
И в использовании:
public interface IPerson
{
String FirstName { get; set }
String LastName { get; set }
}
public class Person : PropertyNotifier, IPerson
{
private string _FirstName;
private string _LastName;
public String FirstName
{
get { return _FirstName; }
set { SetProperty(ref _FirstName, value); }
}
public String LastName
{
get { return _LastName; }
set { SetProperty(ref _LastName, value); }
}
}
Надеюсь, это поможет!