diff options
Diffstat (limited to 'Xamarin.Forms.Core/Internals/NameScope.cs')
-rw-r--r-- | Xamarin.Forms.Core/Internals/NameScope.cs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/Xamarin.Forms.Core/Internals/NameScope.cs b/Xamarin.Forms.Core/Internals/NameScope.cs new file mode 100644 index 00000000..b29534b6 --- /dev/null +++ b/Xamarin.Forms.Core/Internals/NameScope.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Xml; +using Xamarin.Forms.Xaml; + +namespace Xamarin.Forms.Internals +{ + public class NameScope : INameScope + { + public static readonly BindableProperty NameScopeProperty = BindableProperty.CreateAttached("NameScope", typeof(INameScope), typeof(NameScope), default(INameScope)); + + readonly Dictionary<string, object> _names = new Dictionary<string, object>(); + + object INameScope.FindByName(string name) + { + if (_names.ContainsKey(name)) + return _names[name]; + return null; + } + + void INameScope.RegisterName(string name, object scopedElement) + { + if (_names.ContainsKey(name)) + throw new ArgumentException("An element with the same key already exists in NameScope", "name"); + + _names[name] = scopedElement; + } + + void INameScope.RegisterName(string name, object scopedElement, IXmlLineInfo xmlLineInfo) + { + try + { + ((INameScope)this).RegisterName(name, scopedElement); + } + catch (ArgumentException) + { + throw new XamlParseException(string.Format("An element with the name \"{0}\" already exists in this NameScope", name), xmlLineInfo); + } + } + + void INameScope.UnregisterName(string name) + { + _names.Remove(name); + } + + public static INameScope GetNameScope(BindableObject bindable) + { + return (INameScope)bindable.GetValue(NameScopeProperty); + } + + public static void SetNameScope(BindableObject bindable, INameScope value) + { + bindable.SetValue(NameScopeProperty, value); + } + } +}
\ No newline at end of file |