summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Xaml/MarkupExtensions/ReferenceExtension.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Xaml/MarkupExtensions/ReferenceExtension.cs')
-rw-r--r--Xamarin.Forms.Xaml/MarkupExtensions/ReferenceExtension.cs39
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