如何将RoutedEventHandler正确传递给UserControl?

时间:2013-10-23 15:15:24

标签: wpf data-binding routed-events

我有UserControl c:MenuButtons ItemsControlItemTemplateDataTemplateRadioButton

在主要的wpf窗口中,我使用UserControl,如下所示:

<c:MenuButtons x:Name="MenuProjects"
               SelectionChanged="{Binding d:MenuClick}"
               Height="35"
               MenuItems="{Binding Source={x:Static d:Main.Projects}}" />

我希望Checked的{​​{1}}事件通过主窗口代码隐藏中的RadioButtonUserControl处理程序冒泡并处理它那里。这是一个仅供查看的内容,因此我不在此处使用MenuClick或模型模式。

ICommand RadioButton事件为CheckedRoutedEventHandler中的SelectionChanged以及主窗口中的c:MenuButtons代码隐藏

我无法让它发挥作用。

在MenuButtons类中,我有以下代码:

MenuClick

但是尽管数据绑定,仍未输入添加。为什么不呢?

而且:假设它会绑定,我应该如何在DataTemplate中声明绑定?
我尝试了RoutedEventHandler handler; public event RoutedEventHandler SelectionChanged { add { handler += value; } remove { handler -= value; } } ,它在这个特定的绑定尝试上给出了一个XamlParseException(无法将类型为'System.Reflection.RuntimeEventInfo'的对象强制转换为'System.Reflection.MethodInfo'。)

事实证明是直截了当的:
在MenuButtons类中,你得到:

Checked="{Binding ElementName=root, Path=SelectionChanged}"

在UserControl的xaml中添加:

public static readonly RoutedEvent SelectionChangedEvent = EventManager.RegisterRoutedEvent("SelectionChanged", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MenuButtons));

public event RoutedEventHandler SelectionChanged
{
    add { AddHandler(SelectionChangedEvent, value); }
    remove { RemoveHandler(SelectionChangedEvent, value); }
}
private void RadioButton_Checked(object sender, RoutedEventArgs e)
{
    RoutedEventArgs eventargs = new RoutedEventArgs(MenuButtons.SelectionChangedEvent);
    RaiseEvent(eventargs);
}

在主要表格中你有:

<RadioButton Checked="RadioButton_Checked"

幸运的是 <c:MenuButtons SelectionChanged="MenuProjects_SelectionChanged" 提供了处理事件的信息。

1 个答案:

答案 0 :(得分:2)

您应该检查这些链接:

http://msdn.microsoft.com/en-us/library/ms752288.aspx

还有这个:

http://msdn.microsoft.com/en-us/library/ms742806.aspx

教程将向您展示如何创建路由事件以及如何正确地将它们订阅到元素。

顺便说一下,add { handler += value; }错了。

这是你应该写的:add { this.AddHandler(MyRoutedEvent...);}