Как отключить / включить команды, используя шаблон команд mvvm - PullRequest
0 голосов
/ 28 июня 2019

Я привык к разработке приложений WPF, устанавливая события в xaml и ссылаясь на код в MainWindow.Это позволяет легко включать и отключать события по мере необходимости.Недавно я изучал шаблон MVVM и разработал приложение, которое использует команды для обработки событий.Проблема в том, что я понятия не имею, как отключить команду события.

Мой конкретный сценарий таков: мне нужно отключить некоторые события фильтрации, когда данные загружаются или обновляются, чтобы они не запускались непрерывно... Данные уже связаны, поэтому не должно происходить никаких событий фильтрации.

В прошлом я делал это примерно так:

    listView.SelectionChangedEvent -= new SelectionChangedEvent(event_method);
//Perform actions...
listView.SelectionChangedEvent += new SelectionChangedEvent(event_method);

Я понимаю, что с MVVM яможет использовать RelayCommand или DelegateCommand и передать предикат, который должен отключить команду на основе логического значения.Тогда мне просто нужно вызвать RaiseCanExecuteCommandChanged (), чтобы обновить команду после того, как я изменил логическое значение.Тем не менее, все мои тесты, чтобы сделать эту работу просто, не работают ...

Может кто-нибудь опубликовать краткий пример того, как обрабатывать то, что я описал в MVVM?Все примеры, которые я могу найти, относятся к включению / отключению элементов управления, таких как Button ... Я не смог найти ничего, чтобы фактически отключить выполнение Команды ...

1 Ответ

0 голосов
/ 28 июня 2019

Чтобы гарантировать, что команда не будет выполнена, если CanExecute оценивается как false, вы можете написать декоратор:

public class LimitExecuteIfCanCommandDecorator : CommandDecoratorBase
{
    public LimitExecuteIfCanCommandDecorator( ICommand command ) : base( command )
    {
    }

    public override void Execute( object parameter )
    {
        if ( CanExecute(parameter) ) // check if it evaluates to true
        {
            base.Execute( parameter );
        }
    }
}

public abstract class CommandDecoratorBase : ICommand
{
    protected CommandDecoratorBase(ICommand command)
    {
        _command = command;
    }

    private readonly ICommand _command;

    public event EventHandler CanExecuteChanged
    {
        add
        {
            _command.CanExecuteChanged += value;
        }

        remove
        {
            _command.CanExecuteChanged -= value;
        }
    }

    public virtual bool CanExecute( object parameter )
    {
        return _command.CanExecute( parameter );
    }

    public virtual void Execute( object parameter )
    {
        _command.Execute( parameter );
    }
}

Теперь используйте этот декоратор для переноса всех ваших команд.

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