6

当触发器出现在 ViewModel 中时,我遇到了一个问题,SelectedItem(parameter) 来自先前选择的项目。我需要新选择的项目作为 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>

谢谢维诺德

4

3 回答 3

2

通常,您应该将当前的 SelectionItem 作为参数传递给您的命令。由于事件是用过去时写的,所以你应该得到当前的 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>

然后,您的命令需要访问属性 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
      }
  }

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

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

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

       if (BuildingSelectionCommand.CanExecute(_selectedBuilding)) {
         BuildingSelectionCommand.Execute(_selectedBuilding);
       }
     }
于 2013-04-26T20:19:34.843 回答
2

XAML:

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

命令:

RelayCommand<SelectionChangedEventArgs> BuildingSelectionCommand { get; set; }

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

您刚刚错过了“PassEventArgsToCommand”。确保您的命令具有 SelectionChangedEventArgs。

于 2013-05-08T14:33:41.800 回答
1

解决它的简单方法是使用

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

正如 Jehof 建议的那样,摆脱所有“ <i:”触发器设置,而只需处理SelectedBuilding属性设置器中的更改并调用方法,而不是使用命令来包装方法调用。由于您甚至没有CanExecute在这里使用命令,因此您不会通过命令获得任何好处,而只是添加了更多代码。

于 2013-05-02T22:00:04.787 回答