WPF - CanExecute不适用于DataGrid的ContextMenu

时间:2014-02-05 18:30:11

标签: c# wpf datagrid command

我希望我的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>
        ...

1 个答案:

答案 0 :(得分:2)

只要您觉得需要重新评估该命令,就必须手动调用RaiseCanExecuteChanged方法。 (最有可能的情况是,dataGrid的SelectedItems会发生变化。)

OR

您可以让CommandManager通过挂钩到CanExecuteChanged CommandManager事件来决定何时提出RequerySuggested命令事件:

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

RequerySuggested事件发生时   System.Windows.Input.CommandManager检测可能的条件   改变命令执行的能力。