Триггер взаимодействия перед выделением Изменен 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
здесь, но просто добавив больше кода.