AbstractMultiConverter.cs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536
  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. if (values?.Any() != true)
  19. return default(TOut);
  20. var typed = values.Select(x => x is TIn tin ? tin : default);
  21. return Convert(typed, parameter);
  22. }
  23. public object?[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
  24. {
  25. var typed = value is TOut tout ? tout : default;
  26. var result = Deconvert(typed) ?? new TIn?[] { };
  27. return result.Select(x => x as object).ToArray();
  28. }
  29. }
  30. }