AbstractMultiConverter.cs 1.1 KB

1234567891011121314151617181920212223242526272829303132333435
  1. #nullable enable
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Globalization;
  5. using System.Linq;
  6. using Xamarin.Forms;
  7. namespace InABox.Mobile
  8. {
  9. public abstract class AbstractMultiConverter<TIn, TOut> : BindableObject, IMultiValueConverter
  10. {
  11. protected abstract TOut Convert(IEnumerable<TIn?> value, object? parameter = null);
  12. protected virtual IEnumerable<TIn> Deconvert(TOut? value, object? parameter = null)
  13. {
  14. return default;
  15. }
  16. public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
  17. {
  18. var typed = values.Select(x => x is TIn tin ? tin : default);
  19. return Convert(typed, parameter);
  20. }
  21. public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
  22. {
  23. var typed = value is TOut tout ? tout : default;
  24. var result = Deconvert(typed);
  25. return result.Select(x => x as object).ToArray();
  26. }
  27. }
  28. }