Guest User

Untitled

a guest
Mar 3rd, 2023
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.08 KB | None | 0 0
  1. [ContentProperty(nameof(Binding))]
  2. public class BindingWithBindableConverterParameter : MarkupExtension
  3. {
  4.     public Binding Binding { get; set; }
  5.     public BindingMode Mode { get; set; }
  6.     public IValueConverter Converter { get; set; }
  7.     public Binding ConverterParameter { get; set; }
  8.  
  9.     public BindingWithBindableConverterParameter()
  10.     { }
  11.  
  12.     public BindingWithBindableConverterParameter(string path)
  13.     {
  14.         Binding = new Binding(path);
  15.     }
  16.  
  17.     public BindingWithBindableConverterParameter(Binding binding)
  18.     {
  19.         Binding = binding;
  20.     }
  21.  
  22.     public override object ProvideValue(IServiceProvider serviceProvider)
  23.     {
  24.         var multiBinding = new MultiBinding();
  25.         Binding.Mode = Mode;
  26.         multiBinding.Bindings.Add(Binding);
  27.         if (ConverterParameter != null)
  28.         {
  29.             ConverterParameter.Mode = BindingMode.OneWay;
  30.             multiBinding.Bindings.Add(ConverterParameter);
  31.         }
  32.         var adapter = new MultiValueConverterAdapter
  33.         {
  34.             Converter = Converter
  35.         };
  36.         multiBinding.Converter = adapter;
  37.         return multiBinding.ProvideValue(serviceProvider);
  38.     }
  39.  
  40.     [ContentProperty(nameof(Converter))]
  41.     private class MultiValueConverterAdapter : IMultiValueConverter
  42.     {
  43.         public IValueConverter Converter { get; set; }
  44.  
  45.         private object lastParameter;
  46.  
  47.         public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
  48.         {
  49.             if (Converter == null) return values[0]; // Required for VS design-time
  50.             if (values.Length > 1) lastParameter = values[1];
  51.             return Converter.Convert(values[0], targetType, lastParameter, culture);
  52.         }
  53.  
  54.         public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
  55.         {
  56.             if (Converter == null) return new object[] { value }; // Required for VS design-time
  57.  
  58.             return new object[] { Converter.ConvertBack(value, targetTypes[0], lastParameter, culture) };
  59.         }
  60.     }
  61. }
Advertisement
Add Comment
Please, Sign In to add comment