0

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>

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

4

1 回答 1

0

我设法让它工作,xmal 没有改变。在 contextMenuOpening 后面的代码中,
我检查单击了哪一列,基于此,我将更改 menuitem 的标题

     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”,每个DataGridComboBoxColumn都绑定到数据源,所以我不知道如何获取DataGridComboBoxColumn的selectedValue。所以我的问题是如何获取 DataGridComboBoxColumn 的选定值?另一种方式,如果我可以知道点击了哪一行,那么我将能够从该行中找出 selectedValue 。但我也不知道如何获取为上下文菜单单击了哪一行。谢谢

编辑:我设法以这种方式得到它 var comboColumn = (obj.Content as ComboBox); if(comboColumn != null) { menuitem.Header = "全部设置为" + comboColumn.Text; menu.Visibility = Visibility.Visible; }

不优雅,但有效。谁有更好的解决方案,请告诉我。谢谢

于 2012-01-30T20:39:09.233 回答