Comment transmettre les informations de View à ViewModel avec DelegateCommand?
De mon point de Vue, j'ai un bouton.
Lorsque l'utilisateur clique sur ce bouton, je veux avoir le ViewModel enregistrer le contexte de la 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, le "Save()" méthode ne passe pas d'arguments, alors comment puis-je obtenir les données à partir de la vue à ce point?
#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
source d'informationauteur Edward Tanguay | 2009-05-28
Vous devez vous connecter pour publier un commentaire.
Découvrez cet article MSDN par Josh Smith. En cela, il montre une variante de DelegateCommand qu'il appelle RelayCommand, comme et de les Exécuter et de CanExecute délégués sur RelayCommand accepte un seul paramètre de type object.
À l'aide de RelayCommand vous pouvez passer des informations aux délégués par l'intermédiaire d'un CommandParameter:
Mise à jour
Regardant cet articleil semble qu'il y est une version générique de DelegateCommand qui accepte un paramètre d'une manière similaire. Vous voudrez peut-être essayer de changer votre SaveCommand à un
DelegateCommand<MyObject>
et de changer votre Enregistrer et CanSave méthodes afin qu'ils prennent une MyObject paramètre.ici est la manière élégante.
Donner un nom à votre zone de texte, puis de lier la CommandParameter dans le bouton de la propriété Text:
Dans votre VM:
À vous de voir, d'utiliser CommandParameter comme Matt exemple.
Vous vous posez à propos de la transmission des données via le bouton de Commande.
Ce que vous voulez vraiment, je pense, est de lier votre zone de texte du texte à un propriété publique dans votre ViewModel:
Je ne suis pas autorisé à faire de commentaires pour l'instant, je suppose. Je suis de répondre à Carlos suggestion parce que je l'ai essayé. Alors que c'est une excellente idée, DelegateCommand aurait besoin d'être modifié d'une certaine façon parce que sinon vous aurez ce message d'erreur:
Un champ d'initialiseur ne peut pas faire référence à la non-champ statique, la méthode ou la propriété 'MyViewModel.Enregistrer(string)'.