Первое решение HappyClicker является лучшим для большинства целей, поскольку оно поддерживает хорошие шаблоны проектирования, такие как MVVM.
Есть еще один простой способ получить тот же результат, используя прикрепленное свойство, поэтому вы можете написать:
<Button Content="Edit" my:RouteToContext.Click="Edit" />
и метод Edit () будет вызываться для DataContext кнопки.
Вот как может быть реализован класс RouteToContext:
public class RouteToContext : DependencyObject
{
public static string GetClick(FrameworkElement element) { return (string)element.GetValue(ClickProperty); }
public static void SetClick(FrameworkElement element, string value) { element.SetValue(ClickProperty, value); }
public static DependencyProperty ClickProperty = ConstructEventProperty("Click");
// Additional proprties can be defined here
private static DependencyProperty ConstructEventProperty(string propertyName)
{
return DependencyProperty.RegisterAttached(
propertyName, typeof(string), typeof(RouteToContext),
new PropertyMetadata
{
PropertyChangedCallback = (obj, propertyChangeArgs) =>
obj.GetType().GetEvent(propertyName)
.AddEventHandler(obj, new RoutedEventHandler((sender, eventArgs) =>
((FrameworkElement)sender).DataContext
.GetType().GetMethod((string)propertyChangeArgs.NewValue)
.Invoke(((FrameworkElement)sender).DataContext,
new object[] { sender, eventArgs }
)
))
}
);
}
}
Как это работает: если установлено RouteToContext.Click
присоединенное свойство, Type.GetEvent()
используется для поиска события с именем «Click», и к нему добавляется обработчик события. Этот обработчик событий использует Type.GetMethod()
, чтобы найти указанный метод в DataContext, затем вызывает метод в DataContext, передавая тот же отправитель и eventArgs, которые он получил.