Advertisement
Guest User

Untitled

a guest
Aug 24th, 2014
409
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.26 KB | None | 0 0
  1. [MarkupExtensionReturnType(typeof(string))]
  2. public class StringFormatExtension : MarkupExtension
  3. {
  4.     ResourceReferenceExpressionConverter rrconverter = new ResourceReferenceExpressionConverter();
  5.     List<object> values = new List<object>();
  6.  
  7.     public StringFormatExtension(object format) { values.Add(format); }
  8.     public StringFormatExtension(object format, object arg0) : this(format) { values.Add(arg0); }
  9.     public StringFormatExtension(object format, object arg0, object arg1) : this(format, arg0) { values.Add(arg1); }
  10.     public StringFormatExtension(object format, object arg0, object arg1, object arg2) : this(format, arg0, arg1) { values.Add(arg2); }
  11.     public StringFormatExtension(object format, object arg0, object arg1, object arg2, object arg3) : this(format, arg0, arg1, arg2) { values.Add(arg3); }
  12.     public StringFormatExtension(object format, object arg0, object arg1, object arg2, object arg3, object arg4) : this(format, arg0, arg1, arg2, arg3) { values.Add(arg4); }
  13.     public StringFormatExtension(object format, object arg0, object arg1, object arg2, object arg3, object arg4, object arg5) : this(format, arg0, arg1, arg2, arg3, arg4) { values.Add(arg5); }
  14.     public StringFormatExtension(object format, object arg0, object arg1, object arg2, object arg3, object arg4, object arg5, object arg6) : this(format, arg0, arg1, arg2, arg3, arg4, arg5) { values.Add(arg6); }
  15.     public StringFormatExtension(object format, object arg0, object arg1, object arg2, object arg3, object arg4, object arg5, object arg6, object arg7) : this(format, arg0, arg1, arg2, arg3, arg4, arg5, arg6) { values.Add(arg7); }
  16.     public StringFormatExtension(object format, object arg0, object arg1, object arg2, object arg3, object arg4, object arg5, object arg6, object arg7, object arg8) : this(format, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) { values.Add(arg8); }
  17.     public StringFormatExtension(object format, object arg0, object arg1, object arg2, object arg3, object arg4, object arg5, object arg6, object arg7, object arg8, object arg9) : this(format, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) { values.Add(arg9); }
  18.  
  19.     DependencyProperty AddBindingTo(FrameworkElement fe, MultiBinding binding)
  20.     {
  21.         var dp = DependencyPropertyDepot.AllocateNewPropertyFor(fe);
  22.         binding.Bindings.Add(new Binding() { Mode = BindingMode.OneWay, Source = fe, Path = new PropertyPath(dp) });
  23.         return dp;
  24.     }
  25.  
  26.     public override object ProvideValue(IServiceProvider serviceProvider)
  27.     {
  28.         var targetProvider = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
  29.         if (targetProvider == null)
  30.             return null;
  31.  
  32.         var targetObj = targetProvider.TargetObject;
  33.         // thankfully stolen from Thomas Levesque's blog
  34.         if (targetObj != null && targetObj.GetType().FullName == "System.Windows.SharedDp")
  35.             return this;
  36.  
  37.         //var schema = ((System.Xaml.IXamlSchemaContextProvider)serviceProvider.GetService(typeof(System.Xaml.IXamlSchemaContextProvider))).SchemaContext;
  38.         //var ap = (System.Xaml.IAmbientProvider)serviceProvider.GetService(typeof(System.Xaml.IAmbientProvider));
  39.         //var ambv = ap.GetFirstAmbientValue(schema.GetXamlType(typeof(UIElement)));
  40.  
  41.         var targetObjFE = (FrameworkElement)targetObj;
  42.  
  43.         var converter = new StringFormatConverter();
  44.         var result = new MultiBinding()
  45.         {
  46.             Converter = converter,
  47.             Mode = BindingMode.OneWay
  48.         };
  49.  
  50.         foreach (var v in values)
  51.         {
  52.             if (v is MarkupExtension)
  53.             {
  54.                 var b = v as Binding;
  55.                 if (b != null)
  56.                 {
  57.                     result.Bindings.Add(b);
  58.                     continue;
  59.                 }
  60.  
  61.                 var mb = v as MultiBinding;
  62.                 if (mb != null)
  63.                 {
  64.                     converter.AddNestedConverter(mb.Converter, mb.ConverterParameter, result.Bindings.Count, mb.Bindings.Count);
  65.                     foreach (var nestedBinding in mb.Bindings)
  66.                         result.Bindings.Add(nestedBinding);
  67.                     continue;
  68.                 }
  69.  
  70.                 //var bb = v as BindingBase;
  71.                 //if (bb != null)
  72.                 //{
  73.                 //    targetObjFE.SetBinding(AddBindingTo(targetObjFE, result), bb);
  74.                 //    continue;
  75.                 //}
  76.             }
  77.  
  78.             if (v is System.Windows.Expression)
  79.             {
  80.                 DynamicResourceExtension mex = null;
  81.                 // didn't find other way to check for dynamic resource
  82.                 try
  83.                 {
  84.                     mex = (MarkupExtension)rrconverter.ConvertTo(v, typeof(MarkupExtension)) as DynamicResourceExtension;
  85.                 }
  86.                 catch (Exception)
  87.                 {
  88.                 }
  89.                 if (mex != null)
  90.                 {
  91.                     targetObjFE.SetResourceReference(AddBindingTo(targetObjFE, result), mex.ResourceKey);
  92.                     continue;
  93.                 }
  94.             }
  95.  
  96.             // fallback
  97.             result.Bindings.Add(new Binding() { Mode = BindingMode.OneWay, Source = v });
  98.         }
  99.  
  100.         return result.ProvideValue(serviceProvider);
  101.     }
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement