2 using System.Collections.Generic;
4 using System.Reflection;
5 using Tizen.NUI.Binding.Internals;
7 namespace Tizen.NUI.Binding
9 [ContentProperty("Actions")]
10 internal sealed class EventTrigger : TriggerBase
12 static readonly MethodInfo s_handlerinfo = typeof(EventTrigger).GetRuntimeMethods().Single(mi => mi.Name == "OnEventTriggered" && mi.IsPublic == false);
13 readonly List<BindableObject> _associatedObjects = new List<BindableObject>();
18 Delegate _handlerdelegate;
20 public EventTrigger() : base(typeof(BindableObject))
22 Actions = new SealedList<TriggerAction>();
25 public IList<TriggerAction> Actions { get; }
29 get { return _eventname; }
32 if (_eventname == value)
35 throw new InvalidOperationException("Event cannot be changed once the Trigger has been applied");
42 internal override void OnAttachedTo(BindableObject bindable)
44 base.OnAttachedTo(bindable);
45 if (!string.IsNullOrEmpty(Event))
46 AttachHandlerTo(bindable);
47 _associatedObjects.Add(bindable);
50 internal override void OnDetachingFrom(BindableObject bindable)
52 _associatedObjects.Remove(bindable);
53 DetachHandlerFrom(bindable);
54 base.OnDetachingFrom(bindable);
57 internal override void OnSeal()
60 ((SealedList<TriggerAction>)Actions).IsReadOnly = true;
63 void AttachHandlerTo(BindableObject bindable)
67 _eventinfo = bindable.GetType().GetRuntimeEvent(Event);
68 _handlerdelegate = s_handlerinfo.CreateDelegate(_eventinfo?.EventHandlerType, this);
72 Console.WriteLine("EventTrigger", "Can not attach EventTrigger to {0}.{1}. Check if the handler exists and if the signature is right.", bindable.GetType(), Event);
74 if (_eventinfo != null && _handlerdelegate != null)
75 _eventinfo.AddEventHandler(bindable, _handlerdelegate);
78 void DetachHandlerFrom(BindableObject bindable)
80 if (_eventinfo != null && _handlerdelegate != null)
81 _eventinfo.RemoveEventHandler(bindable, _handlerdelegate);
85 void OnEventTriggered(object sender, EventArgs e)
87 var bindable = (BindableObject)sender;
88 foreach (TriggerAction action in Actions)
89 action.DoInvoke(bindable);