ContextMenu ItemContainerStyle не применяется - PullRequest
0 голосов
/ 19 января 2012

Я пытаюсь подключить обработчик событий к подменю 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 -->
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...