在我的程序中,我有一个绑定到可观察列表的数据网格。我希望能够将上下文菜单设置为仅在选择行时显示,以便在没有选择任何内容时不会出现错误。为此,我希望能够禁用列标题上的上下文菜单。这是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>
如何禁用标题上的上下文菜单?感谢。
答案 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;
}
}