WPF Paramètre de Commande pour le bouton à l'intérieur de ItemsControl
Je développe une application WPF utilisant le design pattern MVVM.
Dans l'application, j'ai un ItemsControl que l'affichage de plusieurs Boutons (nombre de boutons n'est pas constante, selon le cheminement logique de l'application).
Le ItemsControl est lié à LinkedList dans le ViewModel.
Je suis en mesure de définir une Commande pour les Boutons et je en mesure d'obtenir le gestionnaire de Commande dans le ViewModel seulement si la Commande n'a pas de paramètres...
J'ai besoin d'être en mesure de savoir quel bouton a été cliqué et donc je voudrais avoir une Commande avec le Paramètre.
Comment dois-je définir mon point de Vue ?
Quelle est la Syntaxe pour la CommandParameter et quel paramètre je peut utilisé pour obtenir le contenu de Bouton ?
Quelle sera la Commande de signature dans le ViewModel ?
Veuillez noter que je suis en utilisant RelayCommand de MVVM Light.
Le relvant code de la Vue est ici.
Merci d'avance
<UserControl x:Class="Museum.Controls.CategoriesView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="130" d:DesignWidth="418">
<UserControl.Resources>
<DataTemplate x:Key="CategoriesButtonsTemplate">
<Button Content="{Binding }"
Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, Path=DataContext.CategorySelectedCommand}"
/>
</DataTemplate>
</UserControl.Resources>
<Grid ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition Height="50"></RowDefinition>
<RowDefinition Height=" 40"></RowDefinition>
<RowDefinition Height=" 40"></RowDefinition>
</Grid.RowDefinitions>
<Grid x:Name="SubSubjectGrid" Grid.Row="0"></Grid>
<Grid x:Name="CategoriesGrid" Grid.Row="1">
<ItemsControl Grid.Row="1"
ItemsSource="{Binding Path=CategoriesButtons}"
ItemTemplate="{StaticResource CategoriesButtonsTemplate}" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Grid>
<Grid x:Name="SelectedCategoryGrid" Grid.Row="2"></Grid>
</Grid>
</UserControl>
Vous devez vous connecter pour publier un commentaire.
Vous pouvez simplement utiliser CommandParameter="{Binding }" comme ce
Il y a un générique RelayCommand classe dans MVVM Light toolkit qui peut gérer les paramètres de commande. Le non générique classe RelayCommand les ignore. Voici un exemple:
Première lier votre CommandParameter propriété, comme Ahmed, a montré dans sa réponse:
Permet de dire que la liste chaînée pour les boutons de votre viewmodel est une liste de chaînes de caractères. Votre bouton de contenu et de vos CommandParameter sont liés à l'un de vos éléments de liste. Maintenant, créez un générique RelayCommand propterty dans votre viewmodel:
L'instancier, par exemple comme ceci dans votre constructeur:
Et enfin dans votre méthode, vous obtiendrez la CommandParameter bien que l'argument d'une méthode:
Espère que cela est utile.
Vous pouvez utiliser l'Interactivité et Iteractions bibliothèques. Dans ce cas, vous devez l'ajouter à votre code xaml d'un bouton:
Et à viewModel: