如何在DataGridCell上创建动态上下文菜单

本文关键字:动态 上下文 菜单 创建 DataGridCell | 更新日期: 2023-09-27 18:21:59

WPF,C#,我有一个数据网格,有好几列,好几行。我希望一行中的每个单元格都有不同的上下文菜单项。

如何做到这一点?谢谢我有这个

<UserControl.Resources>
        <ContextMenu x:Key="cellContextMenu">
            <MenuItem x:Name="menuFillUp" Header="Fill _Up" />
        </ContextMenu>
        <Style x:Key="DataGridCellStyle" TargetType="{x:Type dg:DataGridCell}">
            <Setter Property="ContextMenu" Value="{DynamicResource cellContextMenu}" />
        </Style>
        <Style x:Key="DataGridRowStyle"  TargetType="{x:Type dg:DataGridRow}">
            <Style.Triggers>
                <Trigger Property="AlternationIndex" Value="1" >
                    <Setter Property="Background" Value="Beige" />
                </Trigger>
            </Style.Triggers>
            <Setter Property="Margin" Value="0 2 0 2" />            
        </Style>
        <Style x:Key="DataGridStyle" TargetType="{x:Type dg:DataGrid}">
            <Setter Property="AlternationCount" Value="2" />
            <Setter Property="RowStyle" Value="{StaticResource DataGridRowStyle}" />
            <Setter Property="CellStyle" Value="{StaticResource DataGridCellStyle}" />
        </Style>
</UserControl.Resources>

但这是针对数据网格级别的。感谢

如何在DataGridCell上创建动态上下文菜单

我设法做到了,xmal没有改变。在contextMenuOpening的代码隐藏中,
我检查点击了哪一列,在此基础上,我将更改菜单项的标题

     private void basketDG_ContextMenuOpening(object sender, ContextMenuEventArgs e)
    {
        DependencyObject depObj = (DependencyObject)e.OriginalSource;
        while ((depObj != null) && !(depObj is Microsoft.Windows.Controls.DataGridCell))
        {
            depObj = VisualTreeHelper.GetParent(depObj);
        }
        if (depObj == null)
        {
            return;
        }
        if (depObj is Microsoft.Windows.Controls.DataGridCell)
        {
            var obj = depObj as Microsoft.Windows.Controls.DataGridCell;
            var menu = TryFindResource("cellContextMenu") as ContextMenu;
            if (menu != null && menu.Items.Count > 0)
            {
                var menuitem = menu.Items[0] as MenuItem;
                if (menuitem != null)
                {
                    var col = obj.Column.Header;
                    if(col.Equals("Column1") || col.Equals("Column1") 
                        || col.Equals("Column3") || col.Equals("Column4"))
                    {
                        menuitem.Header = "Set all to " + obj;
                        menu.Visibility = Visibility.Visible;
                    }
                    else
                    {
                        menu.Visibility = Visibility.Hidden;
                    }
                }
            }
        }
    } 

但是,有一个新问题,所有列都是DataGridComboBoxColumn,上下文菜单显示"全部设置为Microsoft.Windows.Controls.DataGridCell",每个DataGridCombeBoxColumn都绑定到数据源,所以我不知道如何获取DataGridCombyBoxColumn的selectedValue。所以我的问题是如何获得DataGridComboBoxColumn的选定值?另一种方式是,如果我知道单击了哪一行,那么我就可以从该行中计算出selectedValue。但我也不知道如何获取上下文菜单的点击行。感谢

编辑:我设法做到了var comboColumn=(obj.Content作为组合框);if(comboColumn!=null){菜单项。Header="Set all to"+comboColumn.Text;菜单Visibility=可见性。可见;}

不优雅,但有效。任何人都有更好的解决方案,请告诉我。感谢