Sto tentando di creare un MVVM luce RelayCommand
in un metodo:RelayCommand Esegui delegato non funziona se le variabili locali sono utilizzati
protected RelayCommand NavigateToViewCommand(string viewName) {
#if false
return new RelayCommand(() => {
Debug.WriteLine("It fired.");
Navigation.Navigate(ServiceLocator.Current.GetInstance<IViewLocator>().GetViewForNavigation("StudentPage2"));
});
#else
return new RelayCommand(() => {
Debug.WriteLine("It fired.");
Navigation.Navigate(ServiceLocator.Current.GetInstance<IViewLocator>().GetViewForNavigation(viewName));
});
#endif
}
Se uso il parametro viewName
al metodo nel delegato Execute per la RelayCommand
, non si spara. Lego questo comando a un pulsante. Quando faccio clic sul pulsante, non viene eseguito neanche il comando Debug.WriteLine
(e un punto di interruzione posizionato su di esso non si interromperà).
Tuttavia, se si sostituisce il parametro viewName
con una stringa hardcoded uguale al valore in viewName
, il RelayCommand
funziona correttamente.
Si noti che questo codice, in cui il comando non viene utilizzato in un pulsante esegue senza problemi:
void Test() {
Command1.Execute(null);
Command2("David").Execute(null);
}
RelayCommand Command1 { get { return new RelayCommand(() => Debug.WriteLine("cmd1 executed.")); } }
RelayCommand Command2(string msg) { return new RelayCommand(() => Debug.WriteLine("cmd2 executed: " + msg)); }
Ma se mi legano Command2
-Button.Command
in XAML, non esegue:
public ICommand TestCommand2 { get { return Command2("Cater"); } }
<Button Grid.Row="1" Grid.Column="1" Command="{Binding TestCommand2}" Content="TEST" />
Qualche idea su cosa potrebbe succedere qui?
UPDATE
un'ulteriore sperimentazione dimostra che utilizzando una proprietà virtuale nel delegato Eseguire invece di un parametro non sembra funzionare. Il comando creato da NavigateToViewCommand
in questo codice funziona correttamente quando associato a button.Command. Ciò non risolve il problema, naturalmente; questa è solo più informazione
// In base class:
protected RelayCommand NavigateToViewCommand() {
return new RelayCommand(() => Navigation.Navigate(ServiceLocator.Current.GetInstance<IViewLocator>().GetViewForNavigation(NextPageViewName)));
}
protected virtual string NextPageViewName { get { return string.Empty; } }
// In subclass:
private ICommand m_nextPage;
public ICommand NextPageCommand { get { return m_nextPage ?? (m_nextPage = NavigateToViewCommand()); } }
protected override string NextPageViewName { get { return "StudentPage2"; } }
Ho dimenticato di menzionare il mio ambiente: si tratta di un'applicazione Windows 8.1 WinRT. Sto utilizzando Windows 8.1 a 64 bit (su un MacBook Pro con Boot Camp in esecuzione, se questo è importante). Il comportamento è lo stesso se eseguo l'app localmente o nel simulatore. Ho installato MVVM Light oggi utilizzando nuget in VS 2013 e la versione di GalaSoft.MvvmLight.dll sembra essere la 5.1.1.35049. –