summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Xaml/MarkupExtensions/ReferenceExtension.cs
blob: 6dc8280de5647ce546e4300792486ae6c2592e5e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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");
		}
	}
}