WPF命令可以执行不响应

时间:2018-10-10 20:40:01

标签: c# wpf command selection

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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.

答案 1 :(得分:0)

每当CommandManager.InvalidateRequerySuggested()更改时,您应该调用CanExecuteChanged或引发命令的SomeListView.SelectedItems.Count事件。您可以通过处理SelectionChanged的{​​{1}}事件来检测何时发生:

ListView