You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 07:58:09