diff options
Diffstat (limited to 'Xamarin.Forms.Xaml/MarkupExtensions/ReferenceExtension.cs')
-rw-r--r-- | Xamarin.Forms.Xaml/MarkupExtensions/ReferenceExtension.cs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/Xamarin.Forms.Xaml/MarkupExtensions/ReferenceExtension.cs b/Xamarin.Forms.Xaml/MarkupExtensions/ReferenceExtension.cs new file mode 100644 index 00000000..6dc8280d --- /dev/null +++ b/Xamarin.Forms.Xaml/MarkupExtensions/ReferenceExtension.cs @@ -0,0 +1,39 @@ +using System; +using Xamarin.Forms.Internals; +using Xamarin.Forms.Xaml.Internals; + +namespace Xamarin.Forms.Xaml +{ + [ContentProperty("Name")] + public class ReferenceExtension : IMarkupExtension + { + public string Name { get; set; } + + public object ProvideValue(IServiceProvider serviceProvider) + { + if (serviceProvider == null) + throw new ArgumentNullException("serviceProvider"); + var valueProvider = serviceProvider.GetService(typeof (IProvideValueTarget)) as IProvideParentValues; + if (valueProvider == null) + throw new ArgumentException("serviceProvider does not provide an IProvideValueTarget"); + var namescopeprovider = serviceProvider.GetService(typeof (INameScopeProvider)) as INameScopeProvider; + if (namescopeprovider != null && namescopeprovider.NameScope != null) + { + var value = namescopeprovider.NameScope.FindByName(Name); + if (value != null) + return value; + } + + foreach (var target in valueProvider.ParentObjects) + { + var ns = target as INameScope; + if (ns == null) + continue; + var value = ns.FindByName(Name); + if (value != null) + return value; + } + throw new Exception("Can't resolve name on Element"); + } + } +}
\ No newline at end of file |