我正在尝试将事件处理程序连接到ContextMenu子菜单。如果我将XAML中的处理程序名称从MenuItemClick
更改为其他名称,例如MenuItemClickZZZ
,我得到一个编译时错误,无法找到事件处理程序的定义...所以看起来在编译期间验证了接线。
但是,当我运行程序(使用正确的事件处理程序名称)时,事件不会触发(调试器中的断点未被命中)。
如何正确连接事件处理程序?
XAML
<Window x:Class="WpfProvingGround.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:WpfProvingGround"
Name="MyMainWindow" Height="350" Width="525">
<Grid>
<StackPanel>
<Label>Alias List for </Label>
<StackPanel.ContextMenu>
<ContextMenu x:Name="myMenu">
<ContextMenu.Resources>
<HierarchicalDataTemplate DataType="{x:Type my:Alias}" >
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="MenuItem">
<!-- EVENT HANDLER WIRED HERE -->
<EventSetter Event="Click" Handler="MenuItemClick" />
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
<StackPanel Orientation="Vertical" Background="CornflowerBlue">
<Label Content="Name" />
<TextBlock
Text="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ContextMenu}},
Path=DataContext.Name, FallbackValue='Binding Fail!'}" />
<Label Content="Alias" />
<TextBlock Text="{Binding AltName}" />
</StackPanel>
</HierarchicalDataTemplate>
</ContextMenu.Resources>
<MenuItem ItemsSource="{Binding Aliases}" Header="{Binding Name, FallbackValue='Name Here'}" />
</ContextMenu>
</StackPanel.ContextMenu>
</StackPanel>
</Grid>
</Window>
代码背后
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
MyViewModel vm = new MyViewModel();
// ... view model initialized here
this.DataContext = vm;
}
// EVENT HANDLER DEFINED HERE
private void MenuItemClick(object sender, RoutedEventArgs e)
{
MenuItem mi = e.Source as MenuItem;
} /* BREAKPOINT HERE IS NOT HIT */
}
查看模型
实施INotifyPropertyChanged
并具有属性:
public string Name
public ObservableCollection<Alias> Aliases
更新
我为父Click
MenuItem
事件处理程序
<MenuItem ItemsSource="{Binding Aliases}" Click="MenuItemClickParent" Tag="Tag 0" Header="{Binding Name, FallbackValue='Name Here'}" />
并发现在点击其中一个子MenuItemClickParent
时会触发MenuItem
。 OriginalSource
是我点击的孩子MenuItem
(我真的想拥有自己的事件处理程序),而Source
是父MenuItem
。
当我深入研究OriginalSource
时,我发现根本没有应用任何样式(Style
属性为null)。
我实际上可以通过在父级上使用事件处理程序来解决这个特定问题,但我仍然想了解为什么我的样式没有被应用。
更新2
我还尝试从suggestion实施Tyrsius。但是,这种风格似乎仍未应用。以下是我更改的代码部分:
<Window.Resources>
<Style x:Key="myMenuItemStyle" TargetType="{x:Type MenuItem}">
<EventSetter Event="Click" Handler="MenuItemClick"/>
<Setter Property="Background" Value="Pink"/>
<Setter Property="Tag" Value="Tag 42"/>
</Style>
</Window.Resources>
<HierarchicalDataTemplate DataType="{x:Type my:Alias}" ItemContainerStyle="{StaticResource myMenuItemStyle}" >
<!-- And commented out HierarchicalDataTemplate.ItemContainerStyle -->