KieranB95 Ответов: 2

Удалить контекстное меню правой кнопкой мыши из заголовков столбцов 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 Ответов

Рейтинг:
2

nzmike

Предложенное выше решение не работает (или не работало для меня в любом случае), так как Вам также нужно проверить DataGridRow, иначе вы всегда получаете null, если на самом деле щелкаете правой кнопкой мыши на допустимой строке. Вот что сработало правильно для меня:

        private void dgMP_MOCParts_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
        {
            DependencyObject DepObject = (DependencyObject)e.OriginalSource;

            while ((DepObject != null) && !(DepObject is DataGridColumnHeader) 
&& !(DepObject is DataGridRow))
            {
                DepObject = VisualTreeHelper.GetParent(DepObject);
            }

            if (DepObject == null)
            {
                return;
            }

            if (DepObject is DataGridColumnHeader)
            {
                dgMP_MOCParts.ContextMenu.Visibility = Visibility.Collapsed;
            }
            else
            {
                dgMP_MOCParts.ContextMenu.Visibility = Visibility.Visible;
            }
        }


Рейтинг:
12

VR Karthikeyan

Используйте этот код в PreviewMouseRightButtonDown событие DataGrid,

private void DataGrid_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    DependencyObject DepObject = (DependencyObject)e.OriginalSource;

    while ((DepObject != null) && !(DepObject is DataGridColumnHeader))
    {
        DepObject = VisualTreeHelper.GetParent(DepObject);
    }

    if (DepObject == null)
    {
        return;
    }

    if (DepObject is DataGridColumnHeader)
    {
          dgItems.ContextMenu.Visibility = Visibility.Collapsed;
    }
    else
    {
          dgItems.ContextMenu.Visibility = Visibility.Visible;
    }
}