Выполнить команду с параметром, используя привязку xaml и viewmodel - PullRequest
1 голос
/ 03 мая 2011

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

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

1 Ответ

4 голосов
/ 03 мая 2011

Почему не выполняется моя команда relay?
Как использовать параметр команды?

Если вы используете класс 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)

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

...