Advertisement
Guest User

Untitled

a guest
Aug 24th, 2014
424
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.47 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 targetObjFE = (FrameworkElement)targetObj;
  38.  
  39.         var result = new MultiBinding()
  40.         {
  41.             Converter = new StringFormatConverter(),
  42.             Mode = BindingMode.OneWay
  43.         };
  44.  
  45.         foreach (var v in values)
  46.         {
  47.             if (v is MarkupExtension)
  48.             {
  49.                 var b = v as Binding;
  50.                 if (b != null)
  51.                 {
  52.                     result.Bindings.Add(b);
  53.                     continue;
  54.                 }
  55.  
  56.                 var bb = v as BindingBase;
  57.                 if (bb != null)
  58.                 {
  59.                     targetObjFE.SetBinding(AddBindingTo(targetObjFE, result), bb);
  60.                     continue;
  61.                 }
  62.             }
  63.  
  64.             if (v is System.Windows.Expression)
  65.             {
  66.                 DynamicResourceExtension mex = null;
  67.                 // didn't find other way to check for dynamic resource
  68.                 try
  69.                 {
  70.                     mex = (MarkupExtension)rrconverter.ConvertTo(v, typeof(MarkupExtension)) as DynamicResourceExtension;
  71.                 }
  72.                 catch (Exception)
  73.                 {
  74.                 }
  75.                 if (mex != null)
  76.                 {
  77.                     targetObjFE.SetResourceReference(AddBindingTo(targetObjFE, result), mex.ResourceKey);
  78.                     continue;
  79.                 }
  80.             }
  81.  
  82.             // fallback
  83.             result.Bindings.Add(new Binding() { Mode = BindingMode.OneWay, Source = v });
  84.         }
  85.  
  86.         return result.ProvideValue(serviceProvider);
  87.     }
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement