【问题标题】:WPF Command can execute not respondingWPF 命令可以执行没有响应
【发布时间】:2019-03-15 20:25:49
【问题描述】:

我在按钮上有一个 WPF 命令,用于在 ListView 项目上应用一个选项,如果所选项目计数大于零,则可以执行的操作与列表视图选择有关。

private void DeleteItemCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = SomeListView.SelectedItems.Count > 0;
    }

问题是,即使我选择了一个或多个项目,该命令也永远无法执行。我知道我可以使用CommandManager.InvalidateRequerySuggested(); 刷新所有命令,但我不知道它是否会起作用,以及如何在这里执行?每 1 秒 ?

【问题讨论】:

  • 你能检查一下方法是否被调用了吗?
  • 问题可能是当 selectedItems 改变时命令的 CanExecute 永远不会运行 (NotifyPropertyChanged)

标签: c# wpf command selection


【解决方案1】:

您有两种方法可以做到这一点。

第一种方式:为每个命令创建一个新类。

public class PlusCommand : ICommand
{
    private YourViewModelClass viewModel;
    public PlusCommand(YourViewModelClass vm)
    {
        viewModel = vm;
    }
    public bool CanExecute(object parameter)
    {
        return true;
    }
    public void Execute(object parameter)
    {
        //Your code to run here. Access viewmodel by viewModel variable.
    }

    public event EventHandler CanExecuteChanged;
}

第二种方式:创建一个RelayCommand类,以后每条命令都使用RelayCommand类。

第 1 步:创建 RelayCommand 类。

public class RelayCommand : ICommand    
{    
    private Action<object> execute;    
    private Func<object, bool> canExecute;    

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

    public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)    
    {    
        this.execute = execute;    
        this.canExecute = canExecute;    
    }    

    public bool CanExecute(object parameter)    
    {    
        return this.canExecute == null || this.canExecute(parameter);    
    }    

    public void Execute(object parameter)    
    {    
        this.execute(parameter);    
    }    
}  

第 2 步:通过 RelayCommand 声明一个新命令

RelayCommand PlusCommand= new RelayCommand(o => DoSomething(), o => true); 

你可以read more here.

【讨论】:

    【解决方案2】:

    每当SomeListView.SelectedItems.Count 更改时,您应该调用CommandManager.InvalidateRequerySuggested() 或为命令引发CanExecuteChanged 事件。您可以通过处理ListViewSelectionChanged 事件来检测何时发生这种情况:

    private void SomeListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        CommandManager.InvalidateRequerySuggested();
    }
    

    【讨论】:

    • @betsou:然后,如果您需要任何进一步的帮助,您需要发布您的命令的实现以及其他所有相关内容。
    猜你喜欢
    • 1970-01-01
    • 2011-04-19
    • 2013-02-02
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多