WPF Datagrid行上下文菜单-禁用菜单项[关闭]

Posted

技术标签:

【中文标题】WPF Datagrid行上下文菜单-禁用菜单项[关闭]【英文标题】:WPF Datagrid Row Context Menu - Disable Menu Item [closed] 【发布时间】:2014-10-27 04:41:24 【问题描述】:

嗨,我是初学者程序员和 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

【问题讨论】:

【参考方案1】:

这是解决问题的一种方法。它有点脏但有效。

首先创建一个 IValueConverter 表示 1 表示启用 (true) 并且 Value Converter 可能看起来像这样

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>

【讨论】:

【参考方案2】:

看看WPF Command pattern implementation。 一个命令可以通过实现 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

【讨论】:

以上是关于WPF Datagrid行上下文菜单-禁用菜单项[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何将上下文菜单添加到 wpf 数据网格?

Caliburn.Micro: 如何将函数绑定到DataGrid的RowDetailsTemplate中的上下文菜单项?

为列表视图和列表视图项创建单独的上下文菜单

如何在WPF中模拟右键单击datagrid

wpf 怎么给datagrid 右键菜单加多个选项?

csharp DataGrid行上下文菜单