Должен ли я проверить метод CanExecute ICommand перед вызовом Execute из процедурного кода? - PullRequest
7 голосов
/ 04 августа 2011

При использовании ICommand s в XAML WPF использует метод CanExecute для включения или отключения элементов управления, связанных с командой. Но что, если я звоню Execute из процедурного кода? Должен ли я сначала проверить CanExecute, чтобы убедиться, что команда может быть выполнена, или Execute позаботится об этой проверке для меня?

Другими словами, я должен сделать это:

if (someCommand.CanExecute(parameter, target))
    someCommand.Execute(parameter, target);

Или просто так:

someCommand.Execute(parameter, target);

Ответы [ 3 ]

7 голосов
/ 04 августа 2011

Хороший стиль будет диктовать, что вы должны сделать первое, сначала проверьте CanExecute.Это обеспечит правильную декомпозицию и последовательность в реализации.Кроме того, если вы когда-нибудь захотите использовать эту команду, привязанную к кнопке, она будет работать как положено.

4 голосов
/ 04 августа 2011

Вы должны просто вызвать Execute и позволить реализации команды обработать проверку. CanExecute в основном предназначен для привязок состояний пользовательского интерфейса.

За исключением очень простых однопоточных сценариев, даже если вы сначала вызываете CanExecute, может легко возникнуть условие состязания, при котором действительность команды изменяется между вызовами CanExecute и Execute, что делает бессмысленным вызов CanExecute.

2 голосов
/ 04 августа 2011

Сначала необходимо вызвать CanExecute, но нет ничего, что говорило бы о том, что классы, реализующие ICommand, проверяют свои CanExecute в своем методе Execute.

...