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); }
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); }
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])); }
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); }
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); }
private Delegate GenerateHandler(XamlControl frameworkElement, EventInfo eventInfo) { return(frameworkElement.DataContext != null ? _eventHandlerGenerator.GenerateHandler(eventInfo.EventHandlerType, this, frameworkElement) : _eventHandlerGenerator.GenerateEmptyHandler(eventInfo.EventHandlerType)); }