2012-01-30 98 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