WPF DataGrid上下文菜单命令绑定失效问题求助
WPF DataGrid上下文菜单命令绑定失效问题求助
我最近在做WPF项目时遇到了一个头疼的问题:给DataGrid加带命令绑定的上下文菜单,绑定死活不生效,求助各位大佬!
我最初的XAML写法是这样的,直接给DataGrid定义ContextMenu:
<DataGrid Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="4" Name="DgResults" Margin="10, 25, 10,10" AutoGenerateColumns="False"> <DataGrid.ContextMenu> <ContextMenu> <MenuItem Command="{Binding GenerateDutyCycleCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" Header="Generate DC"></MenuItem> </ContextMenu> </DataGrid.ContextMenu> </DataGrid>
对应的Window后台代码里,我实现了命令相关的属性和方法:
private ICommand? _command; public ICommand GenerateDutyCycleCommand { get { var m = 0; return _command ??= new CommandHandler(GenerateDutyCycle, CanExecute); } } public void GenerateDutyCycle() { MessageBox.Show("Command Executed"); var selectedItem = DgResults.SelectedItem; var p = 0; } public bool CanExecute() { return Results.Count > 0; }
奇怪的是,在XAML编辑器里右键GenerateDutyCycleCommand选「转到定义」,能直接跳转到后台的属性,看起来绑定路径是对的。但一运行起来就完全不对:
- ContextMenu不管有没有数据都一直显示,
CanExecute方法的断点从来没被命中 - 点击菜单项也不会触发
GenerateDutyCycle,连里面的MessageBox都弹不出来 - 运行时还能看到XAML绑定失败的提示:Cannot find source: RelativeSource FindAncestor, AncestorType='System.Windows.Window', AncestorLevel='1'
我试过各种修改,比如给MenuItem手动设置DataContext为Window,但都没用。
后来我换了一种写法,把ContextMenu移到Window的Resources里,写成DataGridRow的样式:
<Style TargetType="{x:Type DataGridRow}"> <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext}"/> <Setter Property="ContextMenu"> <Setter.Value> <ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"> <MenuItem Command="{Binding GenerateDutyCycleCommand}" Header="Generate DC"></MenuItem> </ContextMenu> </Setter.Value> </Setter> </Style>
这次有点进展:当DataGrid里没有结果时,ContextMenu不会显示了。但问题还是没彻底解决——CanExecute和GenerateDutyCycle里的断点依然没触发,有数据时点击菜单项,MessageBox还是不出来。
有没有大佬能帮我看看问题出在哪?感激不尽!
备注:内容来源于stack exchange,提问作者Dominick
相关产品推荐
相关产品推荐

