gpt4 book ai didi

c# - WPF - CanExecute 不适用于 DataGrid 的上下文菜单

转载 作者:太空宇宙 更新时间:2023-11-03 10:50:31 26 4
gpt4 key购买 nike

我想让我的 DataGrids 有一个上下文菜单,允许用户向上或向下移动选定的行。经过一番搜索,我想出了以下有问题的代码。 CanExecute 似乎只被调用一次(我猜是在创建菜单时),所以我的 MenuItem 将始终启用或禁用。我正在努力实现的是在 DataGrid 中选择了行时启用它,而在没有行时禁用它。目前这不起作用。

此外,是否有更优雅的解决方案?如果我使用更多代码,我认为它会变得一团糟......

public class DataGridMoveRowsUpCommand : ICommand
{
public event EventHandler CanExecuteChanged;

public bool CanExecute(object parameter)
{
var grid = parameter as DataGrid;
if (grid != null && grid.SelectedItems.Count > 0) return true;
return false;
}

public void Execute(object parameter)
{
// Do sth...
}

public void RaiseCanExecuteChanged()
{
if (CanExecuteChanged != null) CanExecuteChanged(this, EventArgs.Empty);
}
}
//-------------------------------------------------------------
public class MyDataGrid : DataGrid
{
public static ICommand DataGridMoveRowsUp
{
get { return new DataGridMoveRowsUpCommand(); }
}
}
//-------------------------------------------------------------
<kbm:MyDataGrid x:Name="gridExpenses" ContextMenu="{StaticResource DataGridContextMenu}"/>

//-------------------------------------------------------------
<ContextMenu x:Key="DataGridContextMenu" x:Shared="true">
<MenuItem Header="{DynamicResource StringMoveUp}"
Command="kbm:MyDataGrid.DataGridMoveRowsUp"
CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"
CommandParameter="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}">
</MenuItem>
...

最佳答案

每当您觉得该命令需要重新评估时,您必须手动调用 RaiseCanExecuteChanged 方法。 (最有可能的情况是 dataGrid 的 SelectedItems 被更改。)

或者您可以让 CommandManager 决定何时通过 Hook 到 CommandManager 的 RequerySuggested 事件来引发命令的 CanExecuteChanged 事件,如下所示:

public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}

RequerySuggested event Occurs when the System.Windows.Input.CommandManager detects conditions that might change the ability of a command to execute.

关于c# - WPF - CanExecute 不适用于 DataGrid 的上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21585518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com