Я восстановил Пример CommandSink Джоша Смита с нуля, и моя версия работает без ошибок , за исключением , что мои кнопки команд выделены серым цветом. Я предполагаю, что это потому, что где-то что-то неправильно установлено, поэтому команды никогда не устанавливаются на CanExecute = true
или в какой-то момент устанавливаются на CanExecute = false
.
Но поскольку привязка данных по существу происходит в XAML, я не уверен, где "установить точку останова для команды", поэтому я могу видеть, в какое время назначается кнопка CanExecute = false или, например, НЕ назначается CanExecute = true
.
По сути, у меня есть следующие привязки команд:
<UserControl.CommandBindings>
<sink:CommandSinkBinding Command="vm:CustomerViewModel.CloseCommand"/>
<sink:CommandSinkBinding Command="vm:CustomerViewModel.ShowInformationCommand"/>
</UserControl.CommandBindings>
и в моем CustomerViewModel команда определена так:
public static readonly RoutedCommand CloseCommand = new RoutedCommand();
public bool CanBeClosed
{
get { return _customer.IsOpen; }
}
public void Close()
{
_customer.IsOpen = false;
this.OnPropertyChanged("CanBeClosed");
this.OnPropertyChanged("CanBeApproved");
}
Но так как я понимаю MVVM прямо сейчас, вы настраиваете свой M-VM-M, запускаете свое приложение и все "привязывайте данные и просто работайте".
Полагаю, я ищу что-то вроде «Цикла страниц», как в ASP.NET , в котором нужно пройти, чтобы узнать, когда мои команды CanExecute = true
, а когда они CanExecute = false
.
Как можно было бы отладить шаблон WPF / MVVM, подобный этому, где привязка данных не выполняется явно в коде, и, следовательно, нельзя выполнить пошаговую отладку в классическом смысле?
Ответ:
Хотя эта статья, о которой упоминал Гишу , была в целом полезна в отношении того, как решить проблемы с привязкой данных, и в целом ответила на мой вопрос о том, как это сделать, в моем конкретном случае она мне не помогла .
Что бы это ни стоило, я решил свою особую проблему с этим кодом, выполнив построчное сравнение с исходным кодом Джоша Смита и обнаружил эти две строки, которые отсутствовали в методе CommandSinkBinding.OnCommandSinkChanged
:
if (!ConfigureDelayedProcessing(depObj, commandSink))
ProcessCommandSinkChanged(depObj, commandSink);