Dans ma vue, j'ai un bouton.Comment transmettre les informations de View à ViewModel avec DelegateCommand?
Lorsque l'utilisateur clique sur ce bouton, je souhaite que ViewModel enregistre le contexte du TextBlock dans la base de données.
<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top">
<TextBlock Text="{Binding FirstName}"/>
<TextBox Text="Save this text to the database."/>
<Button Content="Save" Command="{Binding SaveCommand}"/>
</StackPanel>
Cependant, dans mon DelegateCommand dans mon ViewModel, la méthode « Save() » ne passe pas d'arguments, alors comment puis-je obtenir des données de la vue à ce moment-là?
#region DelegateCommand: Save
private DelegateCommand saveCommand;
public ICommand SaveCommand
{
get
{
if (saveCommand == null)
{
saveCommand = new DelegateCommand(Save, CanSave);
}
return saveCommand;
}
}
private void Save()
{
TextBox textBox = ......how do I get the value of the view's textbox from here?....
}
private bool CanSave()
{
return true;
}
#endregion
J'ai effectivement résolu mon problème en liant le TextBox à une propriété ViewModel (INotifyPropertyChanged), dont la valeur à laquelle la commande Save() a accès, mais vos suggestions sont très intéressantes, va les vérifier. –
Il existe un cas d'utilisation spécifique (et raisonnablement courant) où la solution de Matt gagne définitivement l'accès à une valeur liée distincte: les commandes exécutées depuis un 'ItemsControl'. Ici, un bouton, par exemple, dans un ListView peut utiliser son paramètre DataContext comme paramètre et l'élément sur lequel le bouton a été cliqué est transmis avec la commande. Il est difficile de déterminer lequel des nombreux éléments a été cliqué sur son bouton. –
Notez que le 'DelegateCommand' générique a une restriction importante (qui n'est pas détectée avant l'exécution - le compilateur ne se plaindra pas): vous ne pouvez pas utiliser un type de valeur comme paramètre. Le conseil officiel est d'utiliser un type de valeur NULL (qui est autorisé) et vérifiez avant l'utilisation qu'il contient une valeur (https://msdn.microsoft.com/fr-fr/library/gg431410%28v=pandp.50%29 .aspx - voir la section "Remarques"). –