从列标题

时间:2015-10-08 09:41:03

标签: c# wpf xaml datagrid

在我的程序中,我有一个绑定到可观察列表的数据网格。我希望能够将上下文菜单设置为仅在选择行时显示,以便在没有选择任何内容时不会出现错误。为此,我希望能够禁用列标题上的上下文菜单。这是XAML:

<DataGrid Name="dgItems" AutoGenerateColumns="False" SelectionMode="Single" SelectionUnit="FullRow" CanUserAddRows="False" IsReadOnly="True">
  <DataGrid.ContextMenu>
      <ContextMenu>
          <MenuItem Header="Edit Item" Click="EditItem_Click"/>
          <MenuItem Header="Delete Item" Click="DeleteItem_Click"/>
      </ContextMenu>
  </DataGrid.ContextMenu>
   <DataGrid.Columns>
      <DataGridTextColumn Header="Caption" Binding="{Binding Caption}"/>
      <DataGridTextColumn Header="Details" Binding="{Binding Details}"/>
      <DataGridTextColumn Header="DateFrom" Binding="{Binding DateFrom}"/>
      <DataGridTextColumn Header="DateTo" Binding="{Binding DateTo}"/>
      <DataGridTextColumn Header="Source" Binding="{Binding Source}"/>
   </DataGrid.Columns>
</DataGrid>

如何禁用标题上的上下文菜单?感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用DataTrigger设置ContextMenu。触发器会监听SelectedItems.IsEmpty,如果它是false,则会设置ContextMenu

<DataGrid ... >
   <DataGrid.Resources>
       <ContextMenu x:Key="cm">
            <MenuItem Header="Edit Item" Click="EditItem_Click"/>
            <MenuItem Header="Delete Item" Click="DeleteItem_Click"/>
       </ContextMenu>
   </DataGrid.Resources>
   <DataGrid.Style>
      <Style TargetType="DataGrid">
         <Style.Triggers>
             <DataTrigger Binding="{Binding SelectedItems.IsEmpty, 
                          RelativeSource={RelativeSource Self}}" Value="false">
                 <Setter Property="ContextMenu" Value="{StaticResource cm}"/>
             </DataTrigger>
         </Style.Triggers>
      </Style>
   </DataGrid.Style>
   <!-- remaining code -->
</DataGrid>

答案 1 :(得分:-1)

您可以尝试拦截该事件并将其标记为已处理。 首先将事件添加到网格中:

<DataGrid
ItemsSource="{Binding ClassroomStudents, Mode=TwoWay}"
MouseRightButtonUp="DataGrid_MouseRightButtonUp"
</DataGrid>

然后将其标记为已处理:

private void DataGrid_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
    DependencyObject depObj = e.OriginalSource as DependencyObject;

    while(depObj != null && !(depObj is DataGridColumnHeader))
    {
        depObj = VisualTreeHelper.GetParent(depObj);
    }
    if(depObj is DataGridColumnHeader)
    {
        e.Handled = true;
    }
}