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