WPF — привязка команды MVVM к Sub ViewModel

У меня есть VehicleViewModel, у которого есть подчиненная ViewModel NotesViewModel.

public IManageVehicleNotesViewModel NotesViewModel { get; set; }

При первой активации VehicleViewModel я активирую вспомогательную ViewModel.

NotesViewModel.Activate();

Активация вызывает метод для запуска ряда команд, я указал на это и на то, что он вызывается.

CreateCommand = new DelegateCommand<object>(OnCreateCommand, CanCreate);

Однако, несмотря на то, что текстовые поля привязываются к вспомогательному представлению (поэтому DataContext находится на месте), ни одна из команд не является обязательной. Я пытался вызвать RaiseCanExecuteChanged для команд, но они не отключают, не включают и не вызывают методы, как ожидалось.

Я не знаю, актуально ли это (поскольку текстовые поля являются обязательными), но я связываю View и ViewModel с помощью ResourceDictionary, так что...

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:v="clr-namespace:GTS.GRS.N3.Modules.Vehicles.Views"
    xmlns:vm="clr-namespace:GTS.GRS.N3.Modules.Vehicles.Model">
  <DataTemplate DataType="{x:Type vm:ManageVehicleViewModel}">
    <v:ManageVehicleView />
  </DataTemplate>
  <DataTemplate DataType="{x:Type vm:ManageVehicleNotesViewModel}">
    <v:ManageVehicleNotesView />
  </DataTemplate>
</ResourceDictionary>

Команды на верхнем уровне VehicleViewModel работают.

Кто-нибудь испытал что-нибудь подобное? Это порядок, в котором я делаю вещи? Любая помощь с благодарностью!

Ваше здоровье,

Энди


person Andy Clarke    schedule 16.09.2009    source источник


Ответы (2)


Инициирует ли свойство CreateCommand событие PropertyChanged? Если это не так, пользовательский интерфейс не будет уведомлен, когда вы его назначите...

Попробуйте использовать такой инструмент, как Snoop, чтобы проверить, установлено ли свойство Command кнопки.

person Thomas Levesque    schedule 16.09.2009
comment
Большое спасибо, раньше мне никогда не приходилось иметь PropertyChanged в командах, но я только что переделал свои модули. Мне пришло в голову, что RaiseCanExecuteChanged является альтернативой PropertyChanged для команд, спасибо за подсказку! - person Andy Clarke; 16.09.2009
comment
Если команда определена до того, как View будет привязан к ViewModel, вам не нужно поднимать PropertyChanged. В любом случае, мои свойства команды обычно доступны только для чтения и инициализируются отложенно, поэтому мне не нужно об этом беспокоиться. - person Thomas Levesque; 16.09.2009

Сделайте это и проверьте вывод, чтобы увидеть, что происходит:

<UserControl …
     xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase" />

<Button Command="{Binding MyCommand, 
                  diagnostics:PresentationTraceSources.TraceLevel=High}" … />

Он должен сообщать, к какому объекту он на самом деле пытается привязаться, и т. д. Проверьте свое окно вывода во время работы, чтобы увидеть, что происходит с этой привязкой.

person Anderson Imes    schedule 16.09.2009