2

我有一个UserControl c:MenuButtons与一个ItemsControlItemTemplate是一个DataTemplate与一个RadioButton

在主 wpf 窗口中,我使用UserControl如下:

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

我想让Checked事件通过主窗口代码隐藏中的处理程序RadioButton冒泡并在那里处理。这是一个仅供查看的东西,所以我在这里不使用或模型模式。UserControlMenuClickICommand

事件RadioButton Checked是 a RoutedEventHandler,所以SelectionChanged在我的主窗口代码隐藏中c:MenuButtons也是如此。MenuClick

我无法让它工作。

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

RoutedEventHandler handler;
public event RoutedEventHandler SelectionChanged
  {
     add { handler += value; }
     remove { handler -= value; }
  }

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

并且:假设它会被绑定,我应该如何在 DataTemplate 中声明绑定?
我尝试Checked="{Binding ElementName=root, Path=SelectionChanged}"在这种特定的绑定尝试中给出 XamlParseException(无法将类型为“System.Reflection.RuntimeEventInfo”的对象转换为类型“System.Reflection.MethodInfo”。)

结果很简单:
在 MenuButtons 类中,您得到:

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);
}

在 UserControl 的 xaml 中添加:

<RadioButton Checked="RadioButton_Checked"

在主要形式中,您有:

 <c:MenuButtons SelectionChanged="MenuProjects_SelectionChanged"

幸运的是,那里e.OriginalSource提供了处理事件的信息。

4

1 回答 1

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...);}

于 2013-10-23T15:21:13.520 回答