2013-04-26 5 views
6

Ho un problema quando il trigger arriva in ViewModel the SelectedItem (parametro) arriva l'elemento precedentemente selezionato. Ho bisogno dell'elemento appena selezionato come parametro su selectionChanged.Interaction Trigger prima della selezioneChanged di ListPicker in Windows Phone 8

Sono nuovo nel WP8. Di seguito è riportato il codice

<toolkit:ListPicker Header="Background" 
            ExpansionMode="FullscreenOnly" 
            Template="{StaticResource ListPickerControlTemplate}" 
            VerticalAlignment="Top" 
            ItemsSource="{Binding Path=Buildings.ObjectList}" 
            Margin="0" 
            x:Name="buldings" 
            Padding="0"> 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="SelectionChanged"> 
          <i:InvokeCommandAction Command="{Binding Path=BuildingSelectionCommand}" 
                CommandParameter="{Binding Path=SelectedItem, ElementName=buldings}" /> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 

Grazie Vinod

risposta

2

Normalmente si dovrebbe ottenere il momento SelectionItem passato come parametro al comando. Dal momento che l'evento è scritto al passato, in modo che si dovrebbe ottenere il SelectedItem corrente e non quello precedente.

Quello che puoi provare è aggiungere un'associazione per SelectedItem al tuo ListPicker e omettere di passare l'oggetto SelectedItem al tuo comando come parametro.

<toolkit:ListPicker SelectedItem="{Binding SelectedBuilding, Mode=TwoWay}" > 
    <i:Interaction.Triggers> 
    <i:EventTrigger EventName="SelectionChanged"> 
     <i:InvokeCommandAction Command="{Binding Path=BuildingSelectionCommand}"/> 
    </i:EventTrigger> 
    </i:Interaction.Triggers> 
</toolkit:ListPicker> 

Il comando deve quindi accedere alla SelectedBuilding proprietà per l'esecuzione

public class BuildingSelectionCommand{ 

     // a reference to your ViewModel that contains the SelectedBuilding-Property 
     public BuildingsViewModel ViewModel { 
     get; 
     set; 
     } 

     public bool CanExecute(object parameter) { 
     return ViewModel.SelectedBuilding != null; 
     } 

     public void Execute(object parameter){ 
     var selectedItem = ViewModel.SelectedBuilding; 

     // execute command logic with selectedItem 
     } 
    } 

Il codice può essere differente dalla vostra parte, perche 'dipende da come è stato implementato il tuo ViewModel e Command, ma penso dovresti prenderlo

Un altro modo senza utilizzare un EventTrigger, è eseguire il comando direttamente nella Proprietà SelectedBuilding.

public Building SelectBuilding{ 
    get { 
     return _selectedBuilding 
    } 
    set{ 
     _selectedBuilding = value; 
     RaisePropertyChanged("SelectedBuilding"); 

     if (BuildingSelectionCommand.CanExecute(_selectedBuilding)) { 
     BuildingSelectionCommand.Execute(_selectedBuilding); 
     } 
    } 
+0

Non ho trovato SelectedItemChanged come evento di ListPicker. E ho provato sopra il codice e non ha funzionato. Non è stato licenziato. – vinod8812

+0

@ vinod8812 corretto, ListPicker ha solo l'evento SelectionChanged. è colpa mia. Ho aggiornato la mia risposta per fornire un'altra soluzione – Jehof

+0

Non penso che funzionerà come voglio eseguire un metodo asincrono. In nessun caso, posso eseguire un metodo asincrono. – vinod8812

1

Il modo più semplice per risolverlo è quello di utilizzare

SelectedItem="{Binding SelectedBuilding, Mode=TwoWay}" 

come Jehof suggerito e di sbarazzarsi di tutti i "<i:" impostazioni di trigger, ma semplicemente gestire il cambiamento nella proprietà setter SelectedBuilding e chiamare un metodo invece di usare i comandi per avvolgere una chiamata di metodo. Non stai ottenendo nulla con un comando dato che non stai nemmeno usando CanExecute qui, ma semplicemente aggiungendo altro codice.

+0

tizio non posso usare proprietà evento modificato per chiamare i metodi pesanti che i metodi troppo asincroni – vinod8812

+0

@ vinod8812 ho davvero Non lo so qual è il tuo problema, ottieni 2 risposte ora e parli sempre dei tuoi metodi asincroni. La tua domanda riguarda il fatto che ottieni sempre l'oggetto sbagliato passato come parametro al tuo comando. Dovresti aggiornare la tua domanda per fornire ulteriori informazioni o dovresti rispondere ad un'altra domanda – Jehof

+0

Non usi PropertyChanged qui. Penso che tu abbia un malinteso su quali sono i metodi asincroni. È possibile chiamare un metodo asincrono da setter SelectedBuilding e il gioco è fatto. –

2

XAML:

<i:EventTrigger EventName="SelectionChanged"> 
    <command:EventToCommand Command="{Binding BuildingSelectionCommand}" PassEventArgsToCommand="True"/> 
</i:EventTrigger> 

Comando:

RelayCommand<SelectionChangedEventArgs> BuildingSelectionCommand { get; set; } 

BuildingSelectionCommand = new RelayCommand<SelectionChangedEventArgs>(async (args) => { }); 

Hai appena perso la "PassEventArgsToCommand". Assicurati che il tuo comando abbia un SelectionChangedEventArgs.

+0

Dopo aver letto le altre risposte, non sono sicuro di quale sia la tua domanda/problema. – SBoss