#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), но я никогда им не пользовался и поэтому не понимаю, как его использовать.
Итак, мои вопросы:
-
Почему не выполняется моя relaycommand?
-
Как мне использовать параметр 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. Попробовал это сегодня, и это все еще не работает. Он никогда не достигает точки останова, которую я установил в поле сообщения