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行上下文菜单-禁用菜单项[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Caliburn.Micro: 如何将函数绑定到DataGrid的RowDetailsTemplate中的上下文菜单项?