2013-04-26 14 views
6

Mam problem, gdy wyzwalacz przychodzi w ViewModel SelectedItem (parametr) przychodzi do poprzednio wybranego elementu. Potrzebuję nowo wybranego elementu jako parametru w selectionChanged.Interakcja Wyzwalanie przed wyborem Zmieniłem ListPicker w Windows Phone 8

Jestem nowy w WP8. Poniżej znajduje się kod

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

Dzięki Vinod

Odpowiedz

2

Normalnie powinieneś dostać aktualnie SelectionItem przekazany jako parametr polecenia. Ponieważ zdarzenie jest napisane w czasie przeszłym, więc powinieneś otrzymać aktualnie SelectedItem, a nie poprzedni.

Możesz spróbować dodać wiązanie dla SelectedItem do swojego obiektu ListPicker i pominąć przekazanie parametru SelectedItem do Twojego polecenia jako.

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

Twój komenda następnie musi mieć dostęp do SelectedBuilding własności wykonać

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 
     } 
    } 

kod może być zaczepienia na swojej stronie, bo to zależy od tego jak zostały zaimplementowane Twój ViewModel i poleceń, ale myślę, powinieneś to zdobyć.

Innym sposobem, bez użycia EventTrigger, jest wykonanie polecenia bezpośrednio w SelectedBuilding-Property.

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

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

Nie znaleziono SelectedItemChanged jako zdarzenia ListPicker. Wypróbowałem powyższy kod i nie zadziałało. Nie zostaje zwolniony. – vinod8812

+0

@ vinod8812 correct, ListPicker ma tylko zdarzenie SelectionChanged. to moja wina. Zaktualizowałem moją odpowiedź, aby zapewnić inne rozwiązanie. – Jehof

+0

Nie sądzę, że to zadziała, ponieważ chcę wykonać metodę asynchroniczną. W żaden sposób nie mogę wykonać metody asynchronicznej. – vinod8812

1

Prostym sposobem rozwiązania go jest użycie

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

jak Jehof sugerowane i pozbyć się wszystkich ustawień trigger „<i:”, ale po prostu obsłużyć zmianę SelectedBuilding własności setter i nazwać metoda zamiast używać poleceń do zawijania wywołania metody. Nie uzyskujesz nic z poleceniem, ponieważ nie używasz tutaj nawet CanExecute, ale po prostu dodajesz więcej kodu.

+0

koleś Nie mogę użyć zdarzenia zmienionego właściwości, aby wywołać ciężkie metody, które również asynchronizują metody – vinod8812

+0

@ vinod8812 Naprawdę nie wiem na czym polega twój problem, otrzymujesz teraz 2 odpowiedzi i zawsze mówisz o swoich metodach asynchronicznych. Twoje pytanie dotyczy tego, że zawsze otrzymujesz niewłaściwy element przekazany jako parametr do twojego polecenia. Powinieneś zaktualizować swoje pytanie, aby podać więcej informacji lub odpowiedzieć na inne pytanie – Jehof

+0

Nie korzystasz z PropertyChanged tutaj. Myślę, że masz nieporozumienie co do metod asynchronicznych. Możesz wywołać metodę asynchroniczną z SelectedBuilding setter i to wszystko. –

2

XAML:

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

Command:

RelayCommand<SelectionChangedEventArgs> BuildingSelectionCommand { get; set; } 

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

Po prostu brakowało "PassEventArgsToCommand". Upewnij się, że twoje polecenie ma SelectionChangedEventArgs.

+0

Po przeczytaniu innych odpowiedzi nie jestem naprawdę pewien, jakie jest twoje pytanie/problem. – SBoss