2010-12-12 52 views
7

J'ai un DocumentListView.Xaml avec un ListBox et 3 boutons. Derrière ce contrôle UserControl se trouve un DocumentListViewModel avec 3 boutons et leur propriété de commande liée à 3 RelayCommands.WPF/MVVM: Désactiver l'état d'un bouton lorsque le ViewModel derrière le UserControl n'est pas encore initialisé?

J'ai 3 contrôleur comme AdministrationController, BillingController, ReportController.

Chaque contrôleur a ObservableCollections comme Client 1: N Ordre 1: N Document identique pour l'autre Contrôleur.

Dans un contrôleur, j'ai une situation de liaison spéciale. Lorsque mon DocumentListViewModel n'est pas initialisé par son ViewModel parent comme OrderViewModel (car aucune commande n'est chargée/n'existe) alors mon UserControl a 3 boutons qui sont ENABLED. Ok l'utilisateur peut appuyer sur les 3 boutons et rien ne se passe mais c'est quand même très déroutant et surtout la cohérence dans mon interface utilisateur a disparu.

Comment puis-je définir la commande d'un bouton par défaut sur "Disabled"?

La définition de la propriété IsEnabled sur false n'aide pas car le bouton restera à l'état désactivé pour toujours. Non CanExecute TRUE le définira sur IsEnabled = true.

ET je ne veux pas introduire une autre propriété IsButtonEnabled ... ce stupide parce qu'alors j'ai les deux mondes winforms et wpf derrière ma logique de boutons ... ICommand devrait suffire.

Répondre

17

Ou vous pouvez utiliser un style pour le bouton pour désactiver:

<Style TargetType="{x:Type Button}" x:Key="DisablerButton"> 
    <Style.Triggers> 
     <Trigger Property="Command" Value="{x:Null}"> 
      <Setter Property="IsEnabled" Value="False" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
+0

Avec votre style, comment la propriété IsEnabled est-elle définie sur TRUE? – Elisabeth

+0

Chaque fois que le déclencheur n'est pas atteint, la procédure normale est appelée. C'est à dire. lorsque la propriété Command est définie et que CanExecute est évalué à true. – Goblin

+0

Fonctionne! c'est ce qui compte maintenant! Merci gobelin. – Elisabeth

5

Ceci est une situation intéressante. Honnêtement, je n'ai jamais rencontré le cas où l'interface utilisateur était chargée et interactive, mais le ViewModel n'était pas encore lié. Cependant, en ignorant cela pendant un instant, vous pourriez potentiellement utiliser une valeur FallbackValue sur votre liaison pour lier une NullCommand disponible globalement ou quelque chose qui retourne toujours false pour sa méthode CanExecute.

<Button Command="{Binding SaveCommand, FallbackValue={StaticResource NullCommand}}" /> 
+0

Le problème est mon DocumentListView est un UserControl utilisé 3 fois. Lorsque je commande = "{Binding SaveCommand, FallbackValue = {x: Null}}" /> le SaveButton est toujours activé. Mais je voudrais le désactiver via Commandant. – Elisabeth

+0

À droite, mon exemple repose sur un NullCommand disponible dans le monde entier, et non sur la valeur x: Null qui, comme vous l'avez noté, activera le bouton. Dans tous les cas, la solution de contournement de Goblin est probablement plus facile à mettre en œuvre. – Josh

+1

Ceci est une solution extrêmement agréable, en particulier pour Silverlight. –