using System; using System.Globalization; using System.Windows.Data; namespace InABox.WPF; public class UtilityConverterEventArgs : EventArgs { public object Value { get; private set; } public object Parameter { get; private set; } public UtilityConverterEventArgs(object value, object parameter) { Value = value; Parameter = parameter; } } public delegate void UtilityCoverterEvent(object sender, UtilityConverterEventArgs args); public abstract class UtilityConverter : IValueConverter { public event UtilityCoverterEvent? Converting; public event UtilityCoverterEvent? Deconverting; public abstract TOut Convert(TIn value); public virtual TIn? Deconvert(TOut value) { return default; } public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var typed = value is TIn tin ? tin : default; Converting?.Invoke(this,new UtilityConverterEventArgs(typed, parameter)); return Convert(typed); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { var typed = value is TOut tout ? tout : default; Deconverting?.Invoke(this,new UtilityConverterEventArgs(typed, parameter)); return Deconvert(typed); } }