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

#c# #xaml #binding #itemscontrol #commandparameter

#c# #xaml #привязка #itemscontrol #commandparameter

Вопрос:

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

Теперь первое, что я хочу, чтобы кнопка вызывала событие в моей viewmodel

 public RelayCommand ItemClicked
{
    get
    {
        return new RelayCommand(() =>
        {
            MessageBox.Show("Something is clicked");
        });
    }
}
  

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

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

  1. Почему не выполняется моя relaycommand?

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

Комментарии:

1. «но он отказывается»: что это значит? Вы получаете ошибку компиляции? Исключение? Видите ли вы ошибки привязки в окне вывода? Невозможно ответить на ваш вопрос с помощью предоставленной вами информации

2. И какую реализацию RelayCommand вы используете? Это не стандартный класс, существует несколько реализаций

3. Используя RelayCommand из MVVM Light (GalaSoft)

4. @Levisaxos, я обновил свой ответ. Но вы не ответили на мой первый вопрос…

5. Ах, извините, он отказывается когда-либо достигать relaycommand…

Ответ №1:

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

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

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

Комментарии:

1. У вас опечатка «Вы, вы», я полагаю, вы хотели сказать «Если вы», не уверен, поэтому я оставляю редактирование вам 😉

2. Попробовал это сегодня, и это все еще не работает. Он никогда не достигает точки останова, которую я установил в поле сообщения