Я только что обновил проект с Catel 3.4 до Catel 4.0, и пользовательская кнопка «Применить», которая работала, теперь не активируется.
AddCustomButton(new DataWindowButton("Apply", ExecuteApply, canExecuteApply));
В Catel 3.4 функция canExecuteApply вызывалась, когда окно получало фокус или изменялся какой-либо элемент управления. В версии 4.0 он вызывается дважды при создании окна и никогда больше.
Я подозреваю, что это как-то связано с частью руководства по обновлению IViewPropertySelector, однако регистрация реализации по умолчанию не имела никакого эффекта, и я не могу понять, в каком пространстве имен находится метод расширения AutoDetectViewPropertiesToSubscribe.
Изменить: я обнаружил, что получаю такое же поведение с некоторыми экземплярами AsynchronousCommand в другом месте приложения. Делегат CanExecute срабатывает при создании элемента управления и никогда больше.
Редактировать 2: это была одна и та же проблема с разными решениями. Объяснение проблемы см. в ответе Герта ван Хоррика.
Если команда зарегистрирована в модели представления, вы можете использовать
ViewModelCommandManager.InvalidateCommands(true);
чтобы получить состояние выполнения для повторной оценки. Для DataWindowButton, как описано выше, мне пришлось вручную вызвать RaiseCanExecuteChanged для команды кнопки, поскольку, насколько я могу судить, эта команда не принадлежит модели vie.
var catelCommand = (applyButton.Command as ICatelCommand);
if (catelCommand != null)
{
catelCommand.RaiseCanExecuteChanged();
}
В любом случае это далеко не подход с лучшими характеристиками производительности, но если желательно то же поведение, что и до обновления, вы можете сделать эти вызовы в следующей подписке на событие:
System.Windows.Input.CommandManager.RequerySuggested += RequerySuggested;
Надеюсь, это поможет кому-нибудь еще столкнуться с этой проблемой.