2015-05-26 5 views
5

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"; } } 
+0

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. –

risposta

0

ho preferito utilizzare in-costruitoICommand motivo invece di questo parametro passa a RelayCommandctor, che significa:

protected RelayCommand NavigateToViewCommand() 
{ 
    return new RelayCommand((viewName) => { 
     Debug.WriteLine("It fired."); 
     Navigation.Navigate(ServiceLocator.Current 
        .GetInstance<IViewLocator>() 
        .GetViewForNavigation(viewName.ToString())); 
    }); 
} 

e chiamare eseguire simili:

NavigateToViewCommand().Execute("David"); 

È un modo più delicato per passare argomenti al tuo comm e. ps .: Non ho provato questo. Spero che non abbia errori di battitura e funzioni bene.

+0

Grazie per la risposta. Vedo quello che stai dicendo, ma il tuo metodo funziona meglio quando il comando viene eseguito dal codice. Nel mio caso, il mio obiettivo è quello di associare il mio ICommand a Button.Command e di incapsulare completamente la logica di ciò che accadrà (navigazione, in questo caso) senza dover associare anche Button.CommandParameter. –

Problemi correlati