Beispiel #1
0
        public static void Bind(XamlControl frameworkElement, string eventName, string methodPath, params object[] arguments)
        {
            var eventInfo = frameworkElement.GetType().GetEvent(eventName) ?? throw new MissingFieldException($"Cannot find \"{eventName}\" event");
            var binding   = new EventBinding(methodPath, arguments);
            var handler   = binding.Bind(frameworkElement, eventInfo);

            eventInfo.AddEventHandler(frameworkElement, handler);
        }
Beispiel #2
0
 public Emitter(TypeBuilder typeBuilder, EventBinding eventBinding, XamlControl source)
 {
     _typeBuilder    = typeBuilder;
     _eventBinding   = eventBinding;
     _source         = source;
     _instanceField  = _typeBuilder.DefineField("_instance", source.GetType(), FieldAttributes.Private);
     _argumentsField = _typeBuilder.DefineField("_arguments", typeof(object[]), FieldAttributes.Private);
     _timerField     = _typeBuilder.DefineField("_timer", typeof(Timer), FieldAttributes.Private);
 }
Beispiel #3
0
        internal static object ResolveBinding(XamlBinding binding, XamlControl source, int position)
        {
#if AVALONIA
            var instancedBinding = binding.Initiate(source, _properties[position]);
            BindingOperations.Apply(source, _properties[position], instancedBinding, null);
#else
            if (!System.Windows.Data.BindingOperations.IsDataBound(source, _properties[position]))
            {
                System.Windows.Data.BindingOperations.SetBinding(source, _properties[position], binding);
            }
#endif
            return(source.GetValue(_properties[position]));
        }
Beispiel #4
0
        private EventInfo TryDetermineEventInfo(IServiceProvider serviceProvider, XamlControl frameworkElement)
        {
            var xamlContextField = serviceProvider.GetType().GetField("_xamlContext", BindingFlags.Instance | BindingFlags.NonPublic);

            if (xamlContextField != null)
            {
                var xamlContext        = xamlContextField.GetValue(serviceProvider);
                var parentPropertyProp = xamlContext.GetType().GetProperty("ParentProperty");
                var parentProperty     = parentPropertyProp?.GetValue(xamlContext, null);
                var nameProp           = parentProperty?.GetType().GetProperty("Name");
                if (nameProp != null)
                {
                    var name = nameProp.GetValue(parentProperty, null).ToString();
                    return(frameworkElement.GetType().GetEvent(name));
                }
            }

            return(null);
        }
Beispiel #5
0
        private Delegate Bind(XamlControl frameworkElement, EventInfo eventInfo)
        {
            var parameters     = eventInfo.EventHandlerType.GetMethod("Invoke").GetParameters();
            var parameterTypes = new Type[parameters.Length];

            for (var i = 0; i < parameters.Length; i++)
            {
                parameterTypes[i] = parameters[i].ParameterType;
            }

            var handler = GenerateHandler(frameworkElement, eventInfo);
            var sync    = new object();
            var binded  = false;

            frameworkElement.DataContextChanged += (sender, e) =>
            {
                lock (sync)
                {
                    eventInfo.RemoveEventHandler(frameworkElement, handler);
                    handler = GenerateHandler(frameworkElement, eventInfo);
                    eventInfo.AddEventHandler(frameworkElement, handler);
                    binded = true;
                }
            };
#if AVALONIA
            frameworkElement.DetachedFromVisualTree += (sender, e) =>
            {
                lock (sync)
                {
                    eventInfo.RemoveEventHandler(frameworkElement, handler);
                    binded = false;
                }
            };
            frameworkElement.AttachedToVisualTree += (sender, e) =>
            {
                lock (sync)
                {
                    eventInfo.AddEventHandler(frameworkElement, handler);
                    binded = true;
                }
            };
#else
            frameworkElement.Unloaded += (sender, e) =>
            {
                lock (sync)
                {
                    eventInfo.RemoveEventHandler(frameworkElement, handler);
                    binded = false;
                }
            };
            frameworkElement.Loaded += (sender, e) =>
            {
                lock (sync)
                {
                    if (!binded)
                    {
                        eventInfo.AddEventHandler(frameworkElement, handler);
                        binded = true;
                    }
                }
            };
#endif
            return(handler);
        }
Beispiel #6
0
 private Delegate GenerateHandler(XamlControl frameworkElement, EventInfo eventInfo)
 {
     return(frameworkElement.DataContext != null
                 ? _eventHandlerGenerator.GenerateHandler(eventInfo.EventHandlerType, this, frameworkElement)
                 : _eventHandlerGenerator.GenerateEmptyHandler(eventInfo.EventHandlerType));
 }