【问题标题】:WPF - Global Context Menu with Commands BindingWPF - 具有命令绑定的全局上下文菜单
【发布时间】:2018-11-25 06:18:09
【问题描述】:

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

<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 Control中创建的,那么就简单了,因为Binding看到了ViewModel却无权访问ViewModel?

【问题讨论】:

    标签: c# wpf mvvm contextmenu


    【解决方案1】:

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

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

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

        <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 Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type Grid}}}" />
    

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

    【讨论】:

    • 感谢它正在工作!我不知道 PlacementTarget。
    猜你喜欢
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 2014-07-20
    • 1970-01-01
    • 2011-09-13
    相关资源
    最近更新 更多