交互之前的触发触发在Windows Phone 8中更改ListPicker

vin*_*812 6 xaml eventtrigger mvvm windows-phone windows-phone-8

当ViewModel中出现触发器时,我遇到了一个问题,SelectedItem(参数)来自之前选择的Item.我需要新选择的项目作为selectionChanged的参数.

我是WP8的新手.下面是代码

    <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>
Run Code Online (Sandbox Code Playgroud)

谢谢Vinod

Jeh*_*hof 2

通常,您应该将当前的 SelectionItem 作为参数传递给您的命令。由于该事件是用过去时态编写的,因此您应该获取当前的 SelectedItem 而不是之前的 SelectedItem。

您可以尝试的是将 SelectedItem 的绑定添加到 ListPicker 并省略将 SelectedItem 作为参数传递给 Command。

<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>
Run Code Online (Sandbox Code Playgroud)

然后,您的命令需要访问属性 SelectedBuilding 才能执行

  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
      }
  }
Run Code Online (Sandbox Code Playgroud)

您这边的代码可能有所不同,因为它取决于您如何实现 ViewModel 和 Command,但我认为您应该得到它。

另一种不使用 EventTrigger 的 方法是直接在 SelectedBuilding-Property 中执行命令。

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

       if (BuildingSelectionCommand.CanExecute(_selectedBuilding)) {
         BuildingSelectionCommand.Execute(_selectedBuilding);
       }
     }
Run Code Online (Sandbox Code Playgroud)