Comment puis-je passer une variable en tant que CommandParameter

Je suis en train d'envoyer une variable à partir de ce Dernier en tant que paramètre à une commande. La commande ressemble à ceci:

public class EditPersonCommand : ICommand
{
  private bool _CanExecute = false;

  public bool CanExecute(object parameter)
  {
     PersonModel p = parameter as PersonModel;
     CanExecuteProperty = (p != null) && (p.Age > 0);
     return CanExecuteProperty;
  }

  public event EventHandler CanExecuteChanged;

  public void Execute(object parameter) { }

  private bool CanExecuteProperty
  {
     get { return _CanExecute; }
     set
     {
        if (_CanExecute != value)
        {
           _CanExecute = value;
           EventHandler can_execute = CanExecuteChanged;
           if (can_execute != null)
           {
              can_execute.Invoke(this, EventArgs.Empty);
           }
        }
     }
  }
}

Le ViewModel ressemble à ceci:

public class PersonViewModel : ViewModelBase
{
  private PersonModel _PersonModel;
  private EditPersonCommand _EditPersonCommand;

  ///<remarks>
  ///must use the parameterless constructor to satisfy <Window.Resources>
  ///</remarks>
  public PersonViewModel()
     : this(new PersonModel())
  {

  }

  public PersonViewModel(PersonModel personModel)
  {
     _PersonModel = personModel;
  }

  public ICommand EditPersonCommand
  {
     get
     {
        if (_EditPersonCommand == null)
        {
           _EditPersonCommand = new EditPersonCommand();
        }
        return _EditPersonCommand;
     }
  }
}

Le xaml ressemble à ceci:

<Button Content="Edit" HorizontalAlignment="Right" Height="20" Width="80"
   Command="{Binding EditPersonCommand}" 
   CommandParameter="{Binding _PersonModel}" />

J'ai essayé de créer une propriété du ViewModel au lieu d'utiliser le privé nom de variable locale, mais qui n'a pas fonctionné non plus. Le object parameter montre toujours null dans l'appel à CanExecute et le bouton n'est jamais activé. Si je change le CommandParameter de la valeur à Hello, puis-je recevoir Hello dans l'appel à CanExecute, donc je ne suis pas sûr pourquoi, la variable ne fonctionne pas. Toute aide serait appréciée.

Mise à jour: j'ai aussi essayé de faire un bien public pour le modèle (que je n'ai pas vraiment envie d'exposer le modèle, mais juste essayé pour voir si ça fonctionne, mais il ne marche pas).

//Added this to the ViewModel
public PersonModel PersonModelProp
{
  get
  {
     return _PersonModel;
  }
  set
  {
     _PersonModel = value;
     OnPropertyChanged("PersonModelProp");
  }
}

Et changé le code xaml:

<Button Content="Edit" HorizontalAlignment="Right" Height="20"  Width="80"
   Command="{Binding EditPersonCommand}" 
   CommandParameter="{Binding PersonModelProp}" />

Mais toujours pas de chance. Le ViewModel ne mettre en œuvre INotifyPropertyChanged

Je fais toujours lié propriétés public, je pense qu'ils doivent être, mais pas sûr à ce sujet.
Pas la cause du problème, mais de le porter CanExecuteChanged de CanExecute est faux. CanExecuteChanged doit être soulevée lors de l'appelant doit appeler CanExecute de nouveau. En fonction de votre CanExecute mise en œuvre, il faut relancer CanExecuteChanged lorsque l'âge d'une personne est changé, mais vous aurez probablement vous en sortir avec de ne jamais élever cet événement à tous, trop.
Avez-vous essayé traçage? Quelle erreur de ne yo voir?

OriginalL'auteur SwDevMan81 | 2012-09-11