Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [MarkupExtensionReturnType(typeof(string))]
- public class StringFormatExtension : MarkupExtension
- {
- ResourceReferenceExpressionConverter rrconverter = new ResourceReferenceExpressionConverter();
- List<object> values = new List<object>();
- public StringFormatExtension(object format) { values.Add(format); }
- public StringFormatExtension(object format, object arg0) : this(format) { values.Add(arg0); }
- public StringFormatExtension(object format, object arg0, object arg1) : this(format, arg0) { values.Add(arg1); }
- public StringFormatExtension(object format, object arg0, object arg1, object arg2) : this(format, arg0, arg1) { values.Add(arg2); }
- public StringFormatExtension(object format, object arg0, object arg1, object arg2, object arg3) : this(format, arg0, arg1, arg2) { values.Add(arg3); }
- public StringFormatExtension(object format, object arg0, object arg1, object arg2, object arg3, object arg4) : this(format, arg0, arg1, arg2, arg3) { values.Add(arg4); }
- 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); }
- 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); }
- 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); }
- 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); }
- 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); }
- DependencyProperty AddBindingTo(FrameworkElement fe, MultiBinding binding)
- {
- var dp = DependencyPropertyDepot.AllocateNewPropertyFor(fe);
- binding.Bindings.Add(new Binding() { Mode = BindingMode.OneWay, Source = fe, Path = new PropertyPath(dp) });
- return dp;
- }
- public override object ProvideValue(IServiceProvider serviceProvider)
- {
- var targetProvider = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
- if (targetProvider == null)
- return null;
- var targetObj = targetProvider.TargetObject;
- // thankfully stolen from Thomas Levesque's blog
- if (targetObj != null && targetObj.GetType().FullName == "System.Windows.SharedDp")
- return this;
- //var schema = ((System.Xaml.IXamlSchemaContextProvider)serviceProvider.GetService(typeof(System.Xaml.IXamlSchemaContextProvider))).SchemaContext;
- //var ap = (System.Xaml.IAmbientProvider)serviceProvider.GetService(typeof(System.Xaml.IAmbientProvider));
- //var ambv = ap.GetFirstAmbientValue(schema.GetXamlType(typeof(UIElement)));
- var targetObjFE = (FrameworkElement)targetObj;
- var converter = new StringFormatConverter();
- var result = new MultiBinding()
- {
- Converter = converter,
- Mode = BindingMode.OneWay
- };
- foreach (var v in values)
- {
- if (v is MarkupExtension)
- {
- var b = v as Binding;
- if (b != null)
- {
- result.Bindings.Add(b);
- continue;
- }
- var mb = v as MultiBinding;
- if (mb != null)
- {
- converter.AddNestedConverter(mb.Converter, mb.ConverterParameter, result.Bindings.Count, mb.Bindings.Count);
- foreach (var nestedBinding in mb.Bindings)
- result.Bindings.Add(nestedBinding);
- continue;
- }
- //var bb = v as BindingBase;
- //if (bb != null)
- //{
- // targetObjFE.SetBinding(AddBindingTo(targetObjFE, result), bb);
- // continue;
- //}
- }
- if (v is System.Windows.Expression)
- {
- DynamicResourceExtension mex = null;
- // didn't find other way to check for dynamic resource
- try
- {
- mex = (MarkupExtension)rrconverter.ConvertTo(v, typeof(MarkupExtension)) as DynamicResourceExtension;
- }
- catch (Exception)
- {
- }
- if (mex != null)
- {
- targetObjFE.SetResourceReference(AddBindingTo(targetObjFE, result), mex.ResourceKey);
- continue;
- }
- }
- // fallback
- result.Bindings.Add(new Binding() { Mode = BindingMode.OneWay, Source = v });
- }
- return result.ProvideValue(serviceProvider);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement