WPF数据网格行上下文菜单-禁用菜单项

5

你好,我是一名初学者程序员,新手入门WPF,有一个简单的问题想请教,但我已经花了很多时间搜索仍然没有解决,所以希望你们能帮助我。 我想要在Datagrid中禁用上下文菜单中的菜单项。 例如:如果在Datagrid中选择了多行,则禁用上下文菜单项“属性”。

<DataGrid.Resources>
    <ContextMenu  x:Key="DataRowContextMenu">
            <MenuItem x:Name="RowContMenuProp"  Header="Properties">
                <MenuItem.Icon>
                    <Image Source="Resources/proporties.ico" Height="16" Width="16" />
                </MenuItem.Icon>
            </MenuItem>
            <Separator Margin="0"  />
            <MenuItem Header="Copy" Command="Copy" >
                <MenuItem.Icon>
                    <Image Source="Resources/copy.ico" Height="16" Width="16" />
                </MenuItem.Icon>
            </MenuItem>
            <MenuItem Header="Remove from list" Click="MenuItem_Click_1" >
                <MenuItem.Icon>
                    <Image Source="Resources/cut.png" Height="16" Width="16" />
                </MenuItem.Icon>
            </MenuItem>
            <MenuItem Header="Remove from project" Click="MenuItem_Click_2" >
                <MenuItem.Icon>
                    <Image Source="Resources/remove.ico" Height="16" Width="16" />
                </MenuItem.Icon>
            </MenuItem>
    </ContextMenu>
</DataGrid.Resources>

<DataGrid.RowStyle >
    <Style TargetType="{x:Type DataGridRow}">
        <Setter Property="ContextMenu" Value="{StaticResource DataRowContextMenu}" />
        <Setter Property="BorderThickness" Value="0"/>
    </Style>
</DataGrid.RowStyle>

-- 禁用右键菜单项

Private Sub datagrid1_MouseUp(sender As Object, e As MouseButtonEventArgs)
        If datagrid1.SelectedItems.Count > 1 Then
2个回答

3
这是一种方法。虽然有点不规范,但它是有效的。
首先,创建一个 IValueConverter 来表示 1 表示启用(true),该值转换器可能如下所示。
```html

首先创建一个 IValueConverter,表示 1 表示启用(true),该值转换器可能如下所示:

```
public class OneReturnsTrueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (int)value == 1;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

然后在您的DataGridRow中保存对DataGrid的引用

<DataGrid.RowStyle >
    <Style TargetType="{x:Type DataGridRow}">
        <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" />
        <Setter Property="ContextMenu" Value="{StaticResource DataRowContextMenu}" />
        <Setter Property="BorderThickness" Value="0"/>
    </Style>
</DataGrid.RowStyle>

最后,将网格的SelectedItems计数绑定到IsEnabled属性。
<DataGrid.Resources>
    <myConverters:OneReturnsTrueConverter x:Key="OneReturnsTrueConverter"/>
    <ContextMenu  x:Key="DataRowContextMenu">
        <MenuItem x:Name="RowContMenuProp"  Header="Properties"
                  DataContext="{Binding Parent.PlacementTarget.Tag , RelativeSource={RelativeSource Self}}"
                  IsEnabled="{Binding Path=SelectedItems.Count, Converter={StaticResource OneReturnsTrueConverter}}" />
    </ContextMenu>
</DataGrid.Resources>

1
请查看WPF命令模式实现。一个命令可以通过实现CanExecute方法来指示操作是否可行。按钮可以订阅CanExecuteChanged事件,并在CanExecute返回false时被禁用,或在CanExecute返回true时启用。

您可以轻松地根据MSDN页面上的代码调整它以满足您的需求。

<MenuItem x:Name="RowContMenuProp" Header="Properties"
          Command="local:ApplicationsCmd.ShowProperties"
          CanExecute="ShowPropertiesCanExecute"
          Executed="ShowPropertiesExecuted" >

然后在代码中:
Private Sub ShowPropertiesExecuted(ByVal sender As Object, ByVal e As ExecutedRoutedEventArgs)
  ...
End Sub

Private Sub ShowPropertiesCanExecute(ByVal sender As Object, ByVal e As CanExecuteRoutedEventArgs)
  e.CanExecute = ...set to True when your condition is met
End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接