Как можно решить проблемы с привязкой данных в MVVM? - PullRequest
3 голосов
/ 22 апреля 2009

Я восстановил Пример 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);

1 Ответ

0 голосов
/ 29 марта 2012

Первая точка:

Для отладки привязки XAML вы можете добавить ссылку на Диагностику из WindowsBase dll в файл XAML, затем при привязке к какому-либо свойству добавьте PresentationTraceSources.TraceLevel. При запуске проверьте окно вывода.

XAML образец:

<TextBlock Text="{Binding someProperty, diagnostics:PresentationTraceSources.TraceLevel=High}"/>

Второй пункт:

Ваша команда, выделенная серым цветом, означает, что ваша привязка работает! Чего не происходит, так это того, что команда не обновляет свое состояние, что означает, что метод CanExe () запустился и установил для команды значение «не может быть завершено», однако он никогда больше не проверяет, может ли он переключить свое состояние обратно на « может exe ". Есть много способов сделать это, но в основном, когда определенное свойство изменяется в вашей ViewModel, обновите состояние вашей команды:

в Prism, например, вы можете вызвать someCommand.RaiseCanExecuteChanged ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...