Я вижу, что System.Windows.Interactivity.EventTrigger.EventName принимает строку. Кроме того, я полагаю, что они должны подключиться к этому событию с помощью отражения.
Но у отражения немного плохое имя, особенно с производительностью, поэтому есть проблемы с производительностью System.Windows.Interactivity.EventTrigger . Итак, является ли приведенный ниже код наиболее эффективным способом подключения к событию, а SDK Expression Blend делает что-то особенное?
public class EventToCommand
{
public static readonly DependencyProperty EventNameProperty = DependencyProperty.RegisterAttached("EventName", typeof(string), typeof(EventToCommand), new UIPropertyMetadata(OnEventHandlerChanged));
public static string GetEventName(DependencyObject obj)
{
return (string)obj.GetValue(EventNameProperty);
}
public static void SetEventName(DependencyObject obj, string value)
{
obj.SetValue(EventNameProperty, value);
}
private static void OnEventHandlerChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
Type objType = obj.GetType();
var info = objType.GetEvent((string)args.NewValue);
MethodInfo handler = typeof(EventToCommand).GetMethod("OnEventHandlerRaised", BindingFlags.Instance | BindingFlags.NonPublic);
var o = Activator.CreateInstance(typeof(EventToCommand));
Delegate d = Delegate.CreateDelegate(info.EventHandlerType, o, handler);
MethodInfo addHandler = info.GetAddMethod();
object[] addHandlerArgs = { d };
addHandler.Invoke(obj, addHandlerArgs);
}
private void OnEventHandlerRaised(object sender, EventArgs args)
{
// Is it a unique instance?
Console.WriteLine(value);
}
Guid value = Guid.NewGuid();
public EventToCommand()
{
}
}