Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Interaction Trigger before selectionChanged of ListPicker in Windows Phone 8

I have a issue when trigger comes in ViewModel the SelectedItem(parameter) comes the previously selected Item. I need the newly selected item as parameter on selectionChanged.

I am new in WP8. Below is the code

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

Thanks Vinod

like image 222
vinod8812 Avatar asked Apr 26 '13 07:04

vinod8812


3 Answers

Normally should you get the currently SelectionItem passed as parameter to your Command. Since the event is written in past tense, so that you should get the currently SelectedItem and not the previously one.

What you can try is to add a binding for the SelectedItem to your ListPicker and omit passing the SelectedItem to your Command as parameter.

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

Your command then needs to access the property SelectedBuilding to execute

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

The code can be diffrent on your side, cause it depends on how you have implemented your ViewModel and Command, but i think you should get it.

Another way without using an EventTrigger, is to execute the command directly in your SelectedBuilding-Property.

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

       if (BuildingSelectionCommand.CanExecute(_selectedBuilding)) {
         BuildingSelectionCommand.Execute(_selectedBuilding);
       }
     }
like image 61
Jehof Avatar answered Sep 30 '22 21:09

Jehof


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) => { });

You just missed the "PassEventArgsToCommand". Make sure your command has a SelectionChangedEventArgs.

like image 44
SBoss Avatar answered Sep 30 '22 21:09

SBoss


The simple way to solve it is to use

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

as Jehof suggested and get rid of all the "<i:" trigger settings but simply handle the change in the SelectedBuilding property setter and call a method instead of using commands to wrap a method call. You are not gaining anything with a command since you are not even using CanExecute here, but simply adding more code.

like image 33
Filip Skakun Avatar answered Sep 30 '22 21:09

Filip Skakun