using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; namespace Remotely.Shared.ViewModels; public interface IInvokePropertyChanged { void InvokePropertyChanged(string propertyName = ""); } public class ViewModelBase : INotifyPropertyChanged, IInvokePropertyChanged { private readonly Dictionary _propertyBackingDictionary = new(); public event PropertyChangedEventHandler? PropertyChanged; public void InvokePropertyChanged(string propertyName = "") { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } protected T? Get([CallerMemberName] string? propertyName = null) { if (string.IsNullOrWhiteSpace(propertyName)) { throw new ArgumentNullException(nameof(propertyName)); } if (_propertyBackingDictionary.TryGetValue(propertyName, out var value) && value is T typedValue) { return typedValue; } return default; } protected bool Set(T? newValue, [CallerMemberName] string? propertyName = null) { if (string.IsNullOrWhiteSpace(propertyName)) { throw new ArgumentNullException(nameof(propertyName)); } if (EqualityComparer.Default.Equals(newValue, Get(propertyName))) { return false; } _propertyBackingDictionary[propertyName] = newValue; OnPropertyChanged(propertyName); return true; } private void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }