using System.ComponentModel; using System.Runtime.CompilerServices; using ReactiveUI; namespace EinmaleinsTrainer.ViewModels; public class ViewModelBase : IReactiveObject { public event PropertyChangedEventHandler? PropertyChanged; public event PropertyChangingEventHandler? PropertyChanging; public void RaisePropertyChanged(PropertyChangedEventArgs args) { PropertyChanged?.Invoke(this, args); } public void RaisePropertyChanging(PropertyChangingEventArgs args) { PropertyChanging?.Invoke(this, args); } protected void OnPropertyChanged([CallerMemberName] string? propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } protected void OnPropertyChanging([CallerMemberName] string? propertyName = null) { PropertyChanging?.Invoke(this, new PropertyChangingEventArgs(propertyName)); } protected bool SetProperty(ref T field, T value, [CallerMemberName] string? propertyName = null) { if (Equals(field, value)) return false; OnPropertyChanging(propertyName); field = value; OnPropertyChanged(propertyName); return true; } }