Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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# 资源上下文菜单中的命令不会触发_C#_Wpf_Mvvm_Command_Contextmenu - Fatal编程技术网

C# 资源上下文菜单中的命令不会触发

C# 资源上下文菜单中的命令不会触发,c#,wpf,mvvm,command,contextmenu,C#,Wpf,Mvvm,Command,Contextmenu,我需要使用上下文菜单来重新启动基于datagrid的服务(上下文菜单应该将服务的名称作为CommandParameter发送) ContextMenu正确显示,但单击MenuItems不会触发命令(未到达断点),但将ContextMenu直接设置为复选框(例如)会完全触发命令 最后,我想要的是在右键单击datagrid的任何项时获得上下文菜单,单击菜单项应将名称列值或整个选定项发送到ViewModel中的命令(然后从那里重新启动流程) 真的伤了我的头好几天,如果你有任何提示 我的数据网格: &l

我需要使用上下文菜单来重新启动基于datagrid的服务(上下文菜单应该将服务的名称作为CommandParameter发送)

ContextMenu正确显示,但单击MenuItems不会触发命令(未到达断点),但将ContextMenu直接设置为复选框(例如)会完全触发命令

最后,我想要的是在右键单击datagrid的任何项时获得上下文菜单,单击菜单项应将名称列值或整个选定项发送到ViewModel中的命令(然后从那里重新启动流程)

真的伤了我的头好几天,如果你有任何提示

我的数据网格:

<DataGrid x:Name="dgServices" HorizontalAlignment="Left" VerticalAlignment="Top" DockPanel.Dock="Top" Height="auto" HeadersVisibility="Row"
              AutoGenerateColumns="False" HorizontalGridLinesBrush="#FFC7E0EE" VerticalGridLinesBrush="#FFC7E0EE" SelectionMode="Single" BorderThickness="0"
              ItemContainerStyle="{StaticResource DefaultRowStyle}" ItemsSource="{Binding Source={StaticResource cvsServ}}">
            <DataGrid.GroupStyle>
                //GROUPSTYLE
            </DataGrid.GroupStyle>
            <DataGrid.Columns>
                <DataGridTemplateColumn Width="30"/>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="373">
                </DataGridTextColumn>
                <DataGridTextColumn Header="Status" Binding="{Binding Status}" Width="356"/>
            </DataGrid.Columns>
        </DataGrid>

如果命令属性是在
DataGrid
的视图模型中定义的,则可以将行的
标记
属性绑定到
DataGrid

<Style x:Key="DefaultRowStyle" TargetType="{x:Type DataGridRow}">
    <Setter Property="ContextMenu" Value="{StaticResource RowMenu}" />
    <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}" />
</Style>

…然后试试这个:

<MenuItem Header="NAME"
          Command="{Binding PlacementTarget.Tag.DataContext.restartService, RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}}"
          CommandParameter="{Binding PlacementTarget.Tag.Name, RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}}"/>


您的命令是否与
服务
集合在同一视图模型中定义?或者在视图模型中表示
服务
集合中的单独项?请尝试以下操作:
@mm8这也没有触发命令,是否故意缺少commandparameter?@PavelAnikhouski是该命令与集合在同一视图模型中定义services@Phoque:什么是
PlacementTarget。键入
?在哪里定义了
类型
属性?是!实际上,这给出了datagrid本身的名称,但如果更改为SelectedItem,我可以在命令中获得进程名称。非常感谢,你有一些关于标签的文档吗?我不知道,为了将来的参考,我在这里添加了一个链接来解释你对标签属性做了什么
    private DelegateCommand _restartService;
    public DelegateCommand restartService
    {
        get
        {
            return _restartService ?? (_restartService = new DelegateCommand(o => TestCommand(o), o => true));
            //return _restartService ?? (_restartService = new DelegateCommand(o => MessageBox.Show($"{o.ToString()}\n{o.GetType()}"), o => true));
            //return _restartService ?? (_restartService = new DelegateCommand(o => Process.Start(new ProcessStartInfo("C:\\Windows\\system32\\cmd.exe", "/c net start "+o.ToString()) { Verb = "runas" }), o => true));
        }

    private void TestCommand(object o)
    {
        MessageBox.Show(o?.GetType()?.ToString() ?? "NULL");
    }
<Style x:Key="DefaultRowStyle" TargetType="{x:Type DataGridRow}">
    <Setter Property="ContextMenu" Value="{StaticResource RowMenu}" />
    <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}" />
</Style>
<MenuItem Header="NAME"
          Command="{Binding PlacementTarget.Tag.DataContext.restartService, RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}}"
          CommandParameter="{Binding PlacementTarget.Tag.Name, RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}}"/>