2010-01-19 9 views
3

J'ai complètement perdu la liaison de commande utilisée dans MVVM. Comment dois-je lier mon objet à la fenêtre et/ou sa commande à la commande pour obtenir la méthode appelée sur le ButtonClick?WPF MVVM: ICommand Liaison aux contrôles

Voici une classe CustomerViewModel:

public class CustomerViewModel : ViewModelBase 
{ 
    RelayCommand _saveCommand; 
    public ICommand SaveCommand 
    { 
     get 
     { 
      if (_saveCommand == null) 
      { 
       _saveCommand = new RelayCommand(param => this.Save(), param => this.CanSave); 
       NotifyPropertyChanged("SaveCommand"); 
      } 
      return _saveCommand; 
     } 
    } 

    public void Save() 
    { 
     ... 
    } 

    public bool CanSave { get { return true; } } 

    ... 

ViewModelBase implémente l'interface INotifyPropertyChanged Voici comment Button est lié à la commande:

<Button Content="Save" Margin="3" Command="{Binding DataContext.Save}" /> 

Une instance de la CustomerViewModel est affecté à la DataContext de la fenêtre qui contient un Button.

L'exemple donné ne fonctionne pas: j'ai mis le point d'arrêt dans la méthode Save mais l'exécution ne passe pas à la méthode. J'ai vu beaucoup d'exemples (sur le stackoverflow aussi), mais je n'arrive pas à comprendre comment la liaison devrait être spécifiée.

Veuillez nous aviser, n'importe quelle aide sera appréciée.

Merci.

P.S. Probablement que je dois préciser RelativeSource dans le bouton de liaison ... quelque chose comme ceci:

Command="{Binding Path=DataContext.Save, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" 

mais quel type doit être spécifié pour ancêtre?

+1

Y a-t-il des erreurs de liaison dans la sortie du programme? Les erreurs de liaison passent souvent inaperçues. Vous devriez aussi essayer Snoop. C'est un outil qui s'attache à votre application en cours d'exécution et peut également détecter les erreurs de liaison. – Thorsten79

Répondre

10

Ce que vous essayez de faire est de lier directement à la méthode Save. Ce n'est pas comment le faire.

En supposant que vous avez défini la DataContext de vue pour une instance de CustomerViewModel, c'est comment vous liez à la SaveCommand:

<Button Content="Save" Margin="3" Command="{Binding SaveCommand}" /> 

Vous ne devez pas appeler NotifyPropertyChanged("SaveCommand");.

+0

Merci beaucoup! ingénieux simple :) Maintenant, j'ai comment ça marche :) P.S. J'ajouterais un score à la réponse mais je n'ai pas encore assez de points. – Budda