我有一个UserControl
c:MenuButtons
与一个ItemsControl
和ItemTemplate
是一个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
冒泡并在那里处理。这是一个仅供查看的东西,所以我在这里不使用或模型模式。UserControl
MenuClick
ICommand
事件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
提供了处理事件的信息。