【问题标题】:WPF - CanExecute doesn't work for DataGrid's ContextMenuWPF - CanExecute 不适用于 DataGrid 的 ContextMenu
【发布时间】:2014-03-02 08:55:50
【问题描述】:

我想让我的 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>
        ...

【问题讨论】:

    标签: c# wpf datagrid command


    【解决方案1】:

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

    您可以让CommandManager 决定何时引发您的命令的CanExecuteChanged 事件,方法是像这样连接到CommandManager 的RequerySuggested 事件:

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

    RequerySuggested 事件发生在 System.Windows.Input.CommandManager 检测可能出现的条件 更改命令的执行能力。

    【讨论】:

    • 非常感谢!通过使用您的第二个建议,我设法使它起作用!我不确定CommandManager 何时需要重新评估CanExecute(),但这是另一个问题! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    相关资源
    最近更新 更多