WPF - Associazione dei comandi MVVM su View ViewModel
Domanda
Ho un VehicleViewModel che ha un ViewModel secondario di NotesViewModel
public IManageVehicleNotesViewModel NotesViewModel { get; set; }
Alla prima attivazione di VehicleViewModel, attivo il ViewModel secondario.
NotesViewModel.Activate();
L'attivazione chiama un metodo per avviare un numero di comandi, ho interrotto questo e viene chiamato.
CreateCommand = new DelegateCommand<object>(OnCreateCommand, CanCreate);
Tuttavia, sebbene le TextBox siano vincolanti sulla vista secondaria (quindi DataContext è attivo) nessuno dei comandi è vincolante - ho provato a chiamare RaiseCanExecuteChanged sui comandi ma non disabilitano, abilitano o chiamano i metodi come previsto.
Non so se sia rilevante (dato che le TextBox sono vincolanti) ma sto associando View e ViewModel usando un ResourceDictionary in questo modo ...
<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>
I comandi sul livello superiore di VehicleViewModel funzionano.
Qualcuno ha sperimentato qualcosa del genere? È l'ordine che sto facendo? Qualsiasi aiuto ricevuto con gratitudine!
Saluti,
Andy
Soluzione
La proprietà CreateCommand
attiva l'evento PropertyChanged
? In caso contrario, l'interfaccia utente non verrà notificata quando la si assegna ...
Prova a utilizzare uno strumento come Snoop per verificare se la proprietà Command
del pulsante è impostato
Altri suggerimenti
Fallo e controlla l'output per vedere cosa sta succedendo:
<UserControl …
xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase" />
<Button Command="{Binding MyCommand,
diagnostics:PresentationTraceSources.TraceLevel=High}" … />
Dovrebbe indicare a quale oggetto sta effettivamente cercando di collegarsi, ecc. Controlla la finestra di output mentre sei in esecuzione per vedere cosa sta succedendo con quell'associazione.