UtilityConverter.cs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using System;
  2. using System.Globalization;
  3. using System.Windows.Data;
  4. namespace InABox.WPF;
  5. public class UtilityConverterEventArgs : EventArgs
  6. {
  7. public object Value { get; private set; }
  8. public object Parameter { get; private set; }
  9. public UtilityConverterEventArgs(object value, object parameter)
  10. {
  11. Value = value;
  12. Parameter = parameter;
  13. }
  14. }
  15. public delegate void UtilityCoverterEvent(object sender, UtilityConverterEventArgs args);
  16. public abstract class UtilityConverter<TIn, TOut> : IValueConverter
  17. {
  18. public event UtilityCoverterEvent? Converting;
  19. public event UtilityCoverterEvent? Deconverting;
  20. public abstract TOut Convert(TIn value);
  21. public virtual TIn? Deconvert(TOut value)
  22. {
  23. return default;
  24. }
  25. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  26. {
  27. var typed = value is TIn tin ? tin : default;
  28. Converting?.Invoke(this,new UtilityConverterEventArgs(typed, parameter));
  29. return Convert(typed);
  30. }
  31. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  32. {
  33. var typed = value is TOut tout ? tout : default;
  34. Deconverting?.Invoke(this,new UtilityConverterEventArgs(typed, parameter));
  35. return Deconvert(typed);
  36. }
  37. }