Выполнить команду с параметрами, используя привязку XAML и ViewModel

StackOverflow https://stackoverflow.com/questions/5867241

Вопрос

В настоящее время у меня есть в 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");
        });
    }
}

Но это отказывается ...
Во -вторых, я хочу иметь возможность поднять событие с помощью параметра (обратите внимание на CommandParameter), но я никогда не использовал его, и поэтому я не понимаю, как его использовать.

Итак, мои вопросы:

  1. Почему не исполняется мой реле?

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

Это было полезно?

Решение

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

Если вы используете RelayCommand класс из Статья Джоша Смита, оба вопроса имеют одинаковый ответ ... конструктор берет Action<object>, не Action. Анкет Так что ваш код должен быть:

    return new RelayCommand((param) =>
    {
        MessageBox.Show("Something is clicked - Parameter value = " + param);
    });

РЕДАКТИРОВАТЬ: ОК, так что вы используете RelayCommand Из света MVVM ... Есть две версии этого класса, одна - общая, а одна - нет. Негенерическая версия не принимает параметр, поэтому вам нужна общая версия. Ваша команда должна выглядеть так:

public RelayCommand<int> ItemClicked
{
    get
    {
        return new RelayCommand<int>((i) =>
        {
            MessageBox.Show("Something is clicked - Parameter value is " + i);
        });
    }
}

(Предполагая, что параметр имеет тип int)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top