namespace FahzeugWPF; using System.ComponentModel; using System.Linq.Expressions; using System.Reflection; using System.Runtime.CompilerServices; public abstract class ViewModelBase : INotifyPropertyChanged { #region Events [field: NonSerialized] public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(Expression> expression) { var lambdaExpression = expression as LambdaExpression; MemberExpression memberExpression = null; if (lambdaExpression.Body is UnaryExpression) { var unaryExpression = lambdaExpression.Body as UnaryExpression; memberExpression = unaryExpression.Operand as MemberExpression; } else { memberExpression = lambdaExpression.Body as MemberExpression; } if (memberExpression != null) { var propertyInfo = memberExpression.Member as PropertyInfo; if (propertyInfo != null) { OnPropertyChanged(propertyInfo.Name); } } } protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } protected bool SetProperty(ref T field, T value, [CallerMemberName] string? propertyName = null) { if (EqualityComparer.Default.Equals(field, value)) { return false; } field = value; OnPropertyChanged(propertyName); return true; } #endregion Events }