Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF-带命令绑定的全局上下文菜单_C#_Wpf_Mvvm_Contextmenu - Fatal编程技术网

C# WPF-带命令绑定的全局上下文菜单

C# WPF-带命令绑定的全局上下文菜单,c#,wpf,mvvm,contextmenu,C#,Wpf,Mvvm,Contextmenu,我想有一个全局上下文菜单,可以在所有数据网格中使用。我在App.xaml中定义了上下文菜单和样式。主窗口是使用多个用户控件构建的 <Application.Resources> <ContextMenu x:Key="contextCommonMenu"> <MenuItem Header="Import from Excel" Command={???} /> <MenuItem Header="Export t

我想有一个全局上下文菜单,可以在所有数据网格中使用。我在App.xaml中定义了上下文菜单和样式。主窗口是使用多个用户控件构建的

<Application.Resources>
    <ContextMenu x:Key="contextCommonMenu">
        <MenuItem Header="Import from Excel" Command={???} />
        <MenuItem Header="Export table to .csv file"/>
        <MenuItem Header="Save to Database"/>
        <MenuItem Header="Clear Data" />
        <MenuItem Header="Synchronize with DB"/>
    </ContextMenu>
    <Style TargetType="DataGrid">
        <Setter Property="ContextMenu" Value="{StaticResource contextCommonMenu}"/>
    </Style>

</Application.Resources>

我的问题是如何将命令从ViewModel绑定到ContextMenu


如果ContextMenu是在UI控件中创建的,那么它很简单,因为绑定可以看到ViewModel,但我没有访问ViewModel的权限?

这里的技巧是使用PlacementTarget属性,该属性包含ContextMenu对齐的元素,在我们的例子中,DataGrid是什么

但这只是解决方案的一半。由于数据模板的原因,DataContext被设置为dataitem,而不是视图模型。因此,您需要另一个相对源查找来查找视图模型。技巧2是使用Tag属性将视图模型从外部绑定到网格,网格就是上面使用的PlacementTarget。我们到了

始终可以通过遍历相对源来设置上下文菜单。例如,您可以设置上下文菜单的datacontext,如下所示:

    <Application.Resources>
       <ContextMenu x:Key="contextCommonMenu" DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
           <MenuItem Header="Import from Excel" Command="{Binding MyCommand}"/>
           <MenuItem Header="Export table to .csv file"/>
           <MenuItem Header="Save to Database"/>
           <MenuItem Header="Clear Data" />
           <MenuItem Header="Synchronize with DB"/>
       </ContextMenu>
       <Style TargetType="{x:Type DataGrid}">
           <Setter Property="ContextMenu" Value="{StaticResource contextCommonMenu}"/>
       </Style>
  </Application.Resources>

现在,在声明datagrid的视图中,您可以放置上下文菜单的标记以了解其绑定:

<DataGrid Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type Grid}}}" />


我希望这对你有用。关联菜单将自动绑定到您在视图模型中定义的命令。

谢谢,它正在工作!我没有意识到PlacementTarget。