2012-01-30 100 views
0

WPF,C#, 我有一个包含多列,多行的数据网格。我希望行中的每个单元格具有不同的上下文菜单项。如何在DataGridCell上创建动态上下文菜单

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

<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> 

但这是为数据网格级别。谢谢

回答

0

我管理这个工作,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“,每个DataGridComboBoxColumnis绑定到数据源,所以我不知道如何获取DataGridComboBoxColumn的selectedValue。所以我的问题是如何获得DataGridComboBoxColumn的选定值? 另一种方式,如果我可以知道哪一行被点击,那么我将能够找出该行中的selectedValue。但我不知道如何获取哪一行被点击用于contextmenu。谢谢

编辑: 我设法得到它这样 var comboColumn =(obj.Content as ComboBox);如果(comboColumn!= null) { menuitem.Header =“全部设置为”+ comboColumn.Text; menu.Visibility = Visibility.Visible; }

不优雅,但工程。任何人都有更好的解决方案,请让我知道。谢谢

+0

请注意:对于我来说DataGridCell的命名空间是'System.Windows.Controls'而不是'Microsoft.Windows.Controls'。 – 2017-06-22 18:46:54