Что заменяет CommandManager в WinRT?
Я начинаю работу с приложениями в стиле Metro (я знаю, что мы не должны называть его Metro, но я никогда не могу вспомнить, что он должен был назвать...), и я реализую DelegateCommand
класс для использования в MVVM. В WPF событие ICommand.CanExecuteChanged
обычно выполняется следующим образом:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
Но класс CommandManager
не существует в WinRT... Есть ли что-то другое? Или мы должны явно инициировать это событие сами?
Ответы
Ответ 1
В WinRT вы должны вручную обновить/поднять CanExecuteChanged. Командующему CommandManager не нужно делать это глобально. Вы можете рассматривать это как боль в шее или серьезное повышение производительности, когда CanExecute не вызывается постоянно. Это означает, что вам нужно подумать о каскадных изменениях свойств, где раньше вам не приходилось. Но так оно и есть. Руководство.
public void RaiseCanExecuteChanged()
{
if (CanExecuteChanged != null)
CanExecuteChanged(this, EventArgs.Empty);
}
Ответ 2
С WPF необходимо, чтобы вы реализовали ICommand.CanExecuteChanged
, как вы описали. Однако для Silverlight это не так. См. Этот связанный вопрос:
привязка WPF CommandParameter не обновляется
Я предполагаю, что в WinRT, как и в Silverlight, CommandManager
не требуется.
См. соответствующую дискуссию здесь:
http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/477cdd19-ee88-4746-97fe-59b8dbd44e0a/