Выполнить команду с параметром, используя привязку 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. Почему моя команда реле не выполняется?

  2. Как мне использовать параметр команды?

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)

Что касается того, почему ваш текущий код не работает, я не могу ответить без дополнительной информации...

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