PropertyViewModelBase.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using SukiUI.Helpers;
  2. using System.ComponentModel;
  3. using System.Reflection;
  4. namespace SukiUI.Controls
  5. {
  6. public abstract class PropertyViewModelBase<T> : SukiObservableObject, IPropertyViewModel<T?>
  7. {
  8. private readonly string _propertyName;
  9. private T? _value;
  10. public T? Value
  11. {
  12. get => _value;
  13. set
  14. {
  15. if (SetAndRaise(ref _value, value))
  16. {
  17. ViewModelSetter(value);
  18. }
  19. }
  20. }
  21. object? IPropertyViewModel.Value
  22. {
  23. get => Value;
  24. set => Value = (T?)value;
  25. }
  26. public string DisplayName { get; }
  27. public bool IsReadOnly { get; init; }
  28. protected PropertyInfo PropertyInfo { get; }
  29. protected INotifyPropertyChanged Viewmodel { get; }
  30. public PropertyViewModelBase(INotifyPropertyChanged viewmodel, string displayName, PropertyInfo propertyInfo)
  31. {
  32. Viewmodel = viewmodel;
  33. DisplayName = displayName;
  34. PropertyInfo = propertyInfo;
  35. IsReadOnly = !propertyInfo.CanWrite;
  36. _propertyName = propertyInfo.Name;
  37. _value = ViewModelGetter();
  38. Viewmodel.PropertyChanged += OnPropertyChanged;
  39. }
  40. private void OnPropertyChanged(object? sender, PropertyChangedEventArgs e)
  41. {
  42. if (_propertyName == e.PropertyName)
  43. {
  44. Value = ViewModelGetter();
  45. }
  46. }
  47. protected T? ViewModelGetter()
  48. {
  49. return (T?)PropertyInfo.GetValue(Viewmodel);
  50. }
  51. protected void ViewModelSetter(T? newValue)
  52. {
  53. if (PropertyInfo.CanWrite)
  54. {
  55. PropertyInfo.SetValue(Viewmodel, newValue);
  56. }
  57. }
  58. public void Dispose()
  59. {
  60. Viewmodel.PropertyChanged -= OnPropertyChanged;
  61. }
  62. }
  63. }