Триггер взаимодействия перед выделением Изменен ListPicker в Windows Phone 8

У меня есть проблема, когда триггер приходит в ViewModel SelectedItem(параметр) приходит ранее выбранный элемент. Мне нужен вновь выбранный элемент в качестве параметра на 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>

Спасибо винод

3 ответа

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.

Обычно вы должны получить текущий SelectionItem, переданный в качестве параметра вашей Команде. Поскольку событие написано в прошедшем времени, вы должны получить текущий выбранный элемент, а не предыдущий.

Вы можете попытаться добавить привязку для SelectedItem в свой ListPicker и пропустить передачу SelectedItem в свою Команду в качестве параметра.

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

Простой способ решить это использовать

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

как предложил Джехоф и избавиться от всего<i:"вызвать настройки, но просто обработать изменение в SelectedBuilding установщик свойства и вызов метода вместо использования команд для переноса вызова метода. Вы ничего не получаете с помощью команды, так как вы даже не используете CanExecute здесь, но просто добавив больше кода.

Другие вопросы по тегам