diff options
author | Jason Smith <jason.smith@xamarin.com> | 2016-03-22 13:02:25 -0700 |
---|---|---|
committer | Jason Smith <jason.smith@xamarin.com> | 2016-03-22 16:13:41 -0700 |
commit | 17fdde66d94155fc62a034fa6658995bef6fd6e5 (patch) | |
tree | b5e5073a2a7b15cdbe826faa5c763e270a505729 /Xamarin.Forms.Core/ElementTemplate.cs | |
download | xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.tar.gz xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.tar.bz2 xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.zip |
Initial import
Diffstat (limited to 'Xamarin.Forms.Core/ElementTemplate.cs')
-rw-r--r-- | Xamarin.Forms.Core/ElementTemplate.cs | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/Xamarin.Forms.Core/ElementTemplate.cs b/Xamarin.Forms.Core/ElementTemplate.cs new file mode 100644 index 00000000..016dee7e --- /dev/null +++ b/Xamarin.Forms.Core/ElementTemplate.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using Xamarin.Forms.Internals; + +namespace Xamarin.Forms +{ +#pragma warning disable 612 + public class ElementTemplate : IElement, IDataTemplate +#pragma warning restore 612 + { + List<Action<object, ResourcesChangedEventArgs>> _changeHandlers; + Element _parent; + + internal ElementTemplate() + { + } + + internal ElementTemplate(Type type) : this() + { + if (type == null) + throw new ArgumentNullException("type"); + + LoadTemplate = () => Activator.CreateInstance(type); + } + + internal ElementTemplate(Func<object> loadTemplate) : this() + { + if (loadTemplate == null) + throw new ArgumentNullException("loadTemplate"); + + LoadTemplate = loadTemplate; + } + + Func<object> LoadTemplate { get; set; } +#pragma warning disable 0612 + Func<object> IDataTemplate.LoadTemplate + { +#pragma warning restore 0612 + get { return LoadTemplate; } + set { LoadTemplate = value; } + } + + void IElement.AddResourcesChangedListener(Action<object, ResourcesChangedEventArgs> onchanged) + { + _changeHandlers = _changeHandlers ?? new List<Action<object, ResourcesChangedEventArgs>>(1); + _changeHandlers.Add(onchanged); + } + + Element IElement.Parent + { + get { return _parent; } + set + { + if (_parent == value) + return; + if (_parent != null) + ((IElement)_parent).RemoveResourcesChangedListener(OnResourcesChanged); + _parent = value; + if (_parent != null) + ((IElement)_parent).AddResourcesChangedListener(OnResourcesChanged); + } + } + + void IElement.RemoveResourcesChangedListener(Action<object, ResourcesChangedEventArgs> onchanged) + { + if (_changeHandlers == null) + return; + _changeHandlers.Remove(onchanged); + } + + public object CreateContent() + { + if (LoadTemplate == null) + throw new InvalidOperationException("LoadTemplate should not be null"); + if (this is DataTemplateSelector) + throw new InvalidOperationException("Cannot call CreateContent directly on a DataTemplateSelector"); + + object item = LoadTemplate(); + SetupContent(item); + + return item; + } + + internal virtual void SetupContent(object item) + { + } + + void OnResourcesChanged(object sender, ResourcesChangedEventArgs e) + { + if (_changeHandlers == null) + return; + foreach (Action<object, ResourcesChangedEventArgs> handler in _changeHandlers) + handler(this, e); + } + } +}
\ No newline at end of file |