Я пытаюсь подключить обработчик событий к подменю ContextMenu. Если я изменю имя обработчика в XAML с MenuItemClick
на другое, например MenuItemClickZZZ
, я получаю ошибку во время компиляции, что определение обработчика событий не может быть найдено ... поэтому кажется, что проводка проверена во время компиляции.
Однако, когда я запускаю программу (с правильным именем обработчика события), событие не срабатывает (точка останова в отладчике не достигается).
Как правильно подключить обработчик событий?
1010 * 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
UPDATE
Я добавил Click
обработчик событий для родителя MenuItem
<MenuItem ItemsSource="{Binding Aliases}" Click="MenuItemClickParent" Tag="Tag 0" Header="{Binding Name, FallbackValue='Name Here'}" />
и обнаружите, что MenuItemClickParent
срабатывает при нажатии одного из дочерних MenuItem
s. OriginalSource
- это дочерний элемент MenuItem
, который я щелкнул (тот, которому я действительно хочу иметь свой собственный обработчик событий), а Source
- родительский MenuItem
.
Когда я углубляюсь в OriginalSource
, я вижу, что стиль не был применен вообще (свойство Style
равно нулю).
На самом деле я могу решить эту конкретную проблему, используя обработчик событий для родителя, но я все же хотел бы понять, почему мой стиль не применяется.
ОБНОВЛЕНИЕ 2
Я также пытался реализовать предложение из 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 -->