我有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
的{{1}}事件通过主窗口代码隐藏中的RadioButton
到UserControl
处理程序冒泡并处理它那里。这是一个仅供查看的内容,因此我不在此处使用MenuClick
或模型模式。
ICommand
RadioButton
事件为Checked
,RoutedEventHandler
中的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"
提供了处理事件的信息。
答案 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...);
}