Может выполнить вопрос, используя команды делегата в призме - PullRequest
0 голосов
/ 02 декабря 2010

Это кажется глупым вопросом, но я просмотрел документы на предмет призмы, искал в интернете и не могу найти пример ... Вот сделка.

Я использую DelegateCommand в Prism, он работает нормально, за исключением случаев, когда я назначаю делегата для выполнения can методу CanExecute. в другой модели представления у меня есть событие, которое принимает bool, которое я тоже публикую, и я вижу, что событие запускается и что bool передается в мою модель представления с командой в нем, нет проблем, но это то, что я надеваю не понимаю ... Как может выполнить знать, что состояние изменилось? Вот код для примера.

из представленных моделей ctor

eventAggregator.GetEvent<NavigationEnabledEvent>().Subscribe(OnNavigationEnabledChange, ThreadOption.UIThread);

NavigateCommand = new DelegateCommand(OnNavigate, () => nextButtonEnabled);

Сейчас - вот событие OnNavigationEnableChange.

private void OnNavigationEnabledChange(bool navigationState)
    {
      nextButtonEnabled = navigationState;
    }
enter code here

Например, я что-то здесь упустил - как команда узнает, что nextButtonEnabled не соответствует действительности?

Если бы кто-то мог указать мне на рабочий пример, это было бы здорово.

ОК - спасибо!

Ответы [ 2 ]

0 голосов
/ 04 декабря 2010

Отвечая на ваш вопрос, как команда узнает, что она теперь включена:

NavigateCommand = new DelegateCommand(OnNavigate, () => nextButtonEnabled);

Эта перегрузка конструктора DelegateCommand принимает 2 параметра: Первый - это действие команды, а второй - делегат CanExecute, который возвращает bool в вашем примере ваше действие CanExecute всегда возвращает nextButtonEnabled

eventAggregator.GetEvent<NavigationEnabledEvent>().Subscribe(OnNavigationEnabledChange, ThreadOption.UIThread);

запускает OnNavigationEnabledChange, что меняется nextButtonEnabled Вот как это работает ...

0 голосов
/ 03 декабря 2010

Вот почему я не использую реализацию DelegateCommand в Prism. Я всегда ненавидел подход на основе обратного вызова для включения / выключения команд. Это совершенно не нужно, и, насколько я могу судить, его единственное (и довольно сомнительное) «преимущество» заключается в том, что оно согласуется с тем, как выполняется само выполнение. Но это всегда казалось мне бессмысленным, потому что выполнение и включение / отключение явно очень разные: кнопка знает, когда она хочет выполнить команду, но не знает, когда ее статус мог измениться.

Так что я всегда пишу что-то вроде этого:

public class RelayCommand : ICommand
{
    private bool _isEnabled;
    private Action _onExecute;

    public RelayCommand(Action executeHandler)
    {
        _isEnabled = true;
        _onExecute = executeHandler;
    }

    public bool IsEnabled
    {
        get { return _isEnabled; }
        set
        {
            _isEnabled = value;
            if (CanExecuteChanged != null)
            {
                CanExecuteChanged(this, EventArgs.Empty);
            }
        }
    }


    public bool CanExecute(object parameter)
    {
        return _isEnabled;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        _onExecute();
    }
}

(При необходимости вы можете изменить это, чтобы использовать слабые ссылки для выполнения обработчиков событий изменения, как это делает Prism.)

Но чтобы ответить на ваш вопрос: как вообще работает обратный вызов? DelegateCommand Prism предлагает метод RaiseCanExecuteChanged, который вы можете вызвать, чтобы попросить его вызвать событие, которое заставит тех, кто вызывает команды, запросить CanExecute вашей команды. Учитывая то, что вы должны сообщать DelegateCommand каждый раз, когда ваш включенный статус меняется, я не вижу значимого преимущества подхода, основанного на обратном вызове. (Хотя иногда вы видите модель широковещания - устроение так, что любое изменение статуса где-либо уведомляет все команды, вызывающие! В этом случае обратный вызов полезен, потому что это означает, что не имеет значения, если вы не знаете, что на самом деле изменилось. Но запрашивать каждую команду мне неприятно.)

...