Wpf 将事件处理程序分配给自定义样式中定义的ContextMenu项

Wpf 将事件处理程序分配给自定义样式中定义的ContextMenu项,wpf,contextmenu,datatemplate,Wpf,Contextmenu,Datatemplate,我创建了带有预定义菜单项的关联菜单样式: <Style TargetType="{x:Type ContextMenu}" x:Key="DataGridColumnFilterContextMenu"> <Setter Property="ContextMenu.Template"> <Setter.Value> &

我创建了带有预定义菜单项的关联菜单样式:

    <Style TargetType="{x:Type ContextMenu}" x:Key="DataGridColumnFilterContextMenu">                
                <Setter Property="ContextMenu.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Border BorderBrush="#868686"
                                BorderThickness="1"
                                Background="#FAFAFA"> 
                                <Grid MaxHeight="500">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="*"/>
                                </Grid.RowDefinitions>
                                <StackPanel>
                                    <MenuItem Header="Filtrēt" StaysOpenOnClick="True" Name="DynSearch">
                                        <MenuItem.Icon>
                                            <Image   RenderOptions.BitmapScalingMode="NearestNeighbor"
                                                     RenderOptions.EdgeMode="Aliased" 
                                                     Source="/Furniture;component/Resources/search4.png" />
                                        </MenuItem.Icon>
                                    </MenuItem>
                                    <Separator  Margin="20 5 20 0"  Height="2" Width="Auto" />
                                    <MenuItem Margin="5 5 0 0" StaysOpenOnClick="True" >
                                        <MenuItem.Template>
                                            <ControlTemplate >
                                                <CheckBox Padding="15 0 0 0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >Iezīmēt/Atzīmēt visus</CheckBox>
                                            </ControlTemplate>
                                        </MenuItem.Template>
                                        <MenuItem.Icon>
                                            <Image   RenderOptions.BitmapScalingMode="NearestNeighbor"
                                                     RenderOptions.EdgeMode="Aliased" 
                                                     Source="/Furniture;component/Resources/search4.png" />
                                        </MenuItem.Icon>
                                    </MenuItem>
                                    <Separator Margin="20 5 20 0" Height="2" Width="Auto" />
                                    <RadioButton Margin="5 5 0 0" Padding="15 0 0 0" GroupName="Sorting" Content="Augoša secībā" IsChecked="True"/>
                                    <RadioButton Margin="5 5 0 0" Padding="15 0 0 0" GroupName="Sorting" Content="Dilstoša secībā" />
                                    <Separator Margin="20 5 20 5" Height="2" Width="Auto" />
                                </StackPanel>
                                <ScrollViewer Grid.Row="1" 
                                              Margin="1,0,1,0"                                            
                                              CanContentScroll="True"
                                              VerticalScrollBarVisibility="Auto"
                                              Grid.ColumnSpan="2">
                                        <ItemsPresenter KeyboardNavigation.DirectionalNavigation="Cycle" />
                                    </ScrollViewer>
                                </Grid>                              
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
当我点击调试器时,它并没有出现MiFiltre_-Click方法。我尝试了不同的活动,比如MouseDown和PreviewMouseDown。我还试图绑定ICommand,但这也不起作用

然后我搜索了这个问题,发现cm.Template.LoadContent()实际上可能会创建ContextMenu模板的新实例,我正在尝试将事件处理程序绑定到不同的控件实例。然后我尝试使用VisualTreeHelper和LogicalTreeHelper获取ContextMenu节点控件,但这也不起作用

以下是一些问题:

  • 如何实现Click事件处理程序绑定
  • 如果第一个问题太难回答 很难,那么如何定义ContextMenu子对象的当前实例呢 定制的

  • 我将假定此菜单样式是在名为“MyResources.xaml”的资源字典中定义的

  • 在同一个项目文件夹中创建一个类文件,并将其命名为“MyResources.xaml.cs”

  • 将其设置为如下所示的部分类:

    namespace WhateverNamespace
    {
        public partial class MyResources
        {
            private void FilterMenuItem_Click(object sender, RoutedEventArgs e)
            {
                MenuItem mi = (MenuItem)sender;
    
                //  Below, PlacementTarget is the control the user right-clicked on. 
                //  Use that directly if you want that instead of its viewmodel. 
    
                //  This works with the conventional ContextMenu defined below.
                //ViewModel viewModel = ((FrameworkElement)((ContextMenu)mi.Parent).PlacementTarget).DataContext as ViewModel;
    
                //  This works with your template design. The only difference is 
                //  TemplatedParent instead of Parent. 
                ViewModel viewModel = 
                    ((FrameworkElement)((ContextMenu)mi.TemplatedParent).PlacementTarget)
                    .DataContext as ViewModel;
    
                MessageBox.Show("FilterMenuItem_Click");
            }
        }
    }
    
  • 为资源字典指定一个
    x:Class
    属性:

    <ResourceDictionary 
        x:Class="WhateverNamespace.MyResources"
    

    我不能这样做,因为我需要在其他类实例的事件处理程序中使用一些变量。顺便说一句,我在App.xaml中保留了这种样式。@Andrew_Miller在单击处理程序中查看查看模型的更新。我从未见过上下文菜单的实现方式与您的相同,但我相信您一定能找到一种方法。@Andrew_Miller哎呀,结果很简单。再次更新。PlacementTarget不是UserControl,而是类似于ContextMenu所在的按钮,但没关系。我绑定了ContextMenu标记所需的所有内容,最重要的是在该处理程序中找到它。非常感谢,埃德·普朗克特!现在我可以做我想做的事了。
    <ResourceDictionary 
        x:Class="WhateverNamespace.MyResources"
    
    <MenuItem 
        Click="FilterMenuItem_Click"
        Header="Filtrēt" 
        StaysOpenOnClick="True" 
        Name="DynSearch">
    
    <ContextMenu x:Key="DataGridColumnFilterContextMenu">
        <MenuItem 
            Click="FilterMenuItem_Click"
            Header="Filtrēt" 
            StaysOpenOnClick="True" 
            Name="DynSearch">
            <MenuItem.Icon>
                <Image
                    RenderOptions.BitmapScalingMode="NearestNeighbor"
                    RenderOptions.EdgeMode="Aliased" 
                    Source="/Furniture;component/Resources/search4.png"
                    />
            </MenuItem.Icon>
        </MenuItem>
        <Separator />
        <MenuItem StaysOpenOnClick="True">
            <MenuItem.Header>
                <CheckBox>Iezīmēt/Atzīmēt visus</CheckBox>
            </MenuItem.Header>
            <MenuItem.Icon>
                <Image   
                    RenderOptions.BitmapScalingMode="NearestNeighbor"
                    RenderOptions.EdgeMode="Aliased" 
                    Source="/Furniture;component/Resources/search4.png"
                    />
            </MenuItem.Icon>
        </MenuItem>
        <Separator />
        <MenuItem>
            <MenuItem.Header>
                <RadioButton GroupName="Sorting" Content="Augoša secībā" IsChecked="True"/>
            </MenuItem.Header>
        </MenuItem>
        <MenuItem>
            <MenuItem.Header>
                <RadioButton GroupName="Sorting" Content="Dilstoša secībā" IsChecked="True"/>
            </MenuItem.Header>
        </MenuItem>
    </ContextMenu>