2009-07-16 8 views
2

J'ai un bouton de contrôle de bande que je veux avoir sur la plupart de mes formulaires.WPF - CanExecute ne se déclenche pas lorsque vous relevez des commandes à partir d'un UserControl

J'ai ajouté les commandes comme suit ...

public ICommand Create 
    { 
     get 
     { 
      return buttonCreate.Command; 
     } 
     set 
     { 
      buttonCreate.Command = value; 
     } 
    } 

J'ai mis ces propriétés de dépendance comme je peux donc lier à eux ...

 public static readonly DependencyProperty CreateCommandProperty = 
     DependencyProperty.Register(
     "Create", 
     typeof(ICommand), 
     typeof(StandardButtonStrip), 
     new PropertyMetadata((ICommand)null)); 

Je suis alors lier mon usercontrol à une commande ...

<commoncontrols:StandardButtonStrip HorizontalAlignment="Stretch" Create="{Binding CreateCommand}" /> 

J'installe la commande comme suit ...

mais malgré le fait que je retourne toujours vrai sur ma méthode CanCreate le bouton est désactivé ... si je mets un point d'arrêt sur retour vrai il ne se déclenche jamais! J'ai essayé ceci pour voir s'il rafraîchira la liaison, mais pas de joie!

_viewModel.CreateCommand.RaiseCanExecuteChanged(); 

Je pense que le problème est en baisse au contrôle de l'utilisateur et la façon dont je passe la commande comme une propriété, mais pas sûr ...

Quelqu'un peut-il aider?

Cheers,

Andy

Répondre

5

La façon dont cela ressemble, vous avez une propriété de dépendance sur un modèle de vue. Si vous utilisez vraiment MVVM, ce n'est certainement pas la façon de s'y prendre (pas à cause de l'adhésion religieuse à un modèle, mais parce que ce n'est pas la façon optimale).

Tout d'abord, votre modèle de vue est-il un DependencyObject? Si tel est le cas, vous devez le rétrograder à une classe qui implémente INotifyPropertyChanged. Pourquoi? Parce que la propriété Command de Button est elle-même DependencyProperty (héritée de ButtonBase) et prend déjà en charge la liaison de données. Si ce n'est pas le cas, une propriété de dépendance ne fonctionnera pas, ce qui est correct, car vous ne devriez pas avoir de propriétés de dépendance sur votre modèle de vue en premier lieu.

Ce que vous devez faire, c'est avoir le modèle de vue en tant que DataContext pour votre contrôle (je suppose que vous avez déjà cette configuration). Ensuite, changer votre CreateCommand de modèle en vue d'une ICommand plaine, et lier la propriété Command du CreateButton comme celui-ci (dans votre style par défaut StandardButtonStrip)

<Button Name="createButton" HorizontalAlignment="Stretch" Command="{Binding CreateCommand}" /> 

De cette façon, il sera toujours réutilisable, il vous suffit de faire en sorte que toute vue le modèle que vous associez à votre contrôle utilisateur a une propriété CreateCommand de type ICommand (et ce modèle de vue sera hérité par défaut du contrôle de bouton - une des plus belles choses que les gars de wpf ont imaginées). Donc, pour récapituler, vous devriez faire l'inverse, plus ou moins.

Espérons que cela a été utile, à votre santé.

+0

Merci, cela a fonctionné un régal! –

0

Avez-vous outrepassé les fonctionnalités du contrôle utilisateur?

Un problème courant consiste à remplacer une méthode sans appeler l'implémentation de la base. Par exemple, si vous avez remplacé OnContentChanged() sans appeler base.OnContentChanged(), vous avez peut-être supprimé accidentellement le déclenchement de l'événement ContentChanged.

1

Une mise en garde à la réponse acceptée -

l'aide d'une commande de délégué je ne pouvais que cela fonctionne si je créé un nouveau

Command<T> : DelegateCommand<T> et branché le gestionnaire de commandes.

event EventHandler ICommand.CanExecuteChanged 
{ 
add { CommandManager.RequerySuggested += value; } 
remove { CommandManager.RequerySuggested -= value; } 
} 
+0

C'est vraiment important. J'ai passé presque une heure à cause de ça. – Tobias

Questions connexes