Команда WPF может выполняться не отвечая - PullRequest
0 голосов
/ 10 октября 2018

У меня есть команда WPF на кнопке для опции, применяемой к элементу ListView, и действие can execute связано с выбором списка просмотра, если число выбранных элементов превышает ноль.

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

Проблема в том, что даже когда я выбираю один или несколько элементов, команда никогда не может быть выполнена.Я знаю, что могу обновить все команды с помощью CommandManager.InvalidateRequerySuggested();, но я не знаю, сработает ли это, и как это сделать здесь?Каждую 1 секунду?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы должны вызывать CommandManager.InvalidateRequerySuggested() или вызывать событие CanExecuteChanged для команды при каждом изменении SomeListView.SelectedItems.Count.Вы можете определить, когда это происходит, обработав событие SelectionChanged для ListView:

private void SomeListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    CommandManager.InvalidateRequerySuggested();
}
0 голосов
/ 11 октября 2018

У вас есть 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); 

Вы можете читать дальше здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...