Выполнить команду с параметром, используя привязку xaml и viewmodel
В настоящее время я имею в xaml:
<ItemsControl ItemsSource="{Binding Facilities, Mode=OneWay}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Style="{StaticResource BorderStyleHeader}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="33" />
<RowDefinition Height="33" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Name}" HorizontalAlignment="Center" Grid.Row="0" Grid.Column="1" FontWeight="Bold" />
<TextBlock Text="{Binding Description}" Grid.Row="1" Grid.Column="1" />
<Button Content="Reserveer Nu" Style="{StaticResource ButtonStyle}"
Margin="5" Grid.Row="1" Grid.Column="0"
Command="{Binding Reservation.ItemClicked}"
CommandParameter="{Binding FacilityId}"/>
</Grid>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Теперь первое, что я хочу, чтобы кнопка подняла событие в моей модели представления.
public RelayCommand ItemClicked
{
get
{
return new RelayCommand(() =>
{
MessageBox.Show("Something is clicked");
});
}
}
но он отказывается...
во-вторых, я хочу иметь возможность вызывать событие с параметром (обратите внимание на параметр команды), но я никогда не использовал его и поэтому не понимаю, как его использовать.
Итак, мои вопросы:
Почему моя команда реле не выполняется?
Как мне использовать параметр команды?
1 ответ
Почему моя команда реле не выполняется?
Как мне использовать параметр команды?
Если вы используете RelayCommand
класс из статьи Джоша Смита, оба вопроса имеют одинаковый ответ... Конструктор принимает Action<object>
не Action
, Итак, ваш код должен быть:
return new RelayCommand((param) =>
{
MessageBox.Show("Something is clicked - Parameter value = " + param);
});
РЕДАКТИРОВАТЬ: ОК, так что вы используете RelayCommand
от MVVM Light... Есть две версии этого класса, одна универсальная, а другая нет. Неуниверсальная версия не принимает параметр, поэтому вам нужна универсальная версия. Ваша команда должна выглядеть так:
public RelayCommand<int> ItemClicked
{
get
{
return new RelayCommand<int>((i) =>
{
MessageBox.Show("Something is clicked - Parameter value is " + i);
});
}
}
(при условии, что параметр имеет тип int
)
Что касается того, почему ваш текущий код не работает, я не могу ответить без дополнительной информации...