Esegui il comando con il parametro utilizzando XAML Binding e ViewModel
-
28-10-2019 - |
Domanda
Attualmente ho in 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>
Ora la prima cosa è che desidero che il pulsante sollevi l'evento nel mio ViewModel
public RelayCommand ItemClicked
{
get
{
return new RelayCommand(() =>
{
MessageBox.Show("Something is clicked");
});
}
}
Ma rifiuta ...
In secondo luogo, voglio essere in grado di sollevare l'evento con un parametro (notare il CommandParameter) ma non l'ho mai usato e quindi non capisco come usarlo.
Quindi le mie domande:
Perché il mio relayCommand non viene eseguito?
Come faccio a utilizzare il parametro di comando?
Soluzione
Perché il mio relayCommand non viene eseguito?
Come faccio a utilizzare il parametro di comando?
Se stai usando il RelayCommand
classe da L'articolo di Josh Smith, entrambe le domande hanno la stessa risposta ... il costruttore prende un Action<object>
, non un Action
. Quindi il tuo codice dovrebbe essere:
return new RelayCommand((param) =>
{
MessageBox.Show("Something is clicked - Parameter value = " + param);
});
EDIT: OK, quindi stai usando il RelayCommand
Dalla luce MVVM ... ci sono due versioni di questa classe, una è generica e una no. La versione non generica non accetta un parametro, quindi hai bisogno della versione generica. Il tuo comando dovrebbe apparire così:
public RelayCommand<int> ItemClicked
{
get
{
return new RelayCommand<int>((i) =>
{
MessageBox.Show("Something is clicked - Parameter value is " + i);
});
}
}
(Supponendo che il parametro sia di tipo int
)
Per quanto riguarda il motivo per cui il tuo codice attuale non funziona, non posso rispondere senza ulteriori informazioni ...