ContextMenu ItemContainerStyle未应用

时间:2012-01-18 20:46:41

标签: wpf xaml

我正在尝试将事件处理程序连接到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时会触发MenuItemOriginalSource是我点击的孩子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 -->

0 个答案:

没有答案