2010-08-17 4 views
2

J'utilise l'architecture MVVM pour développer une application WPF ...WPF Visibilité du bouton

Jusqu'à présent, tout s'est bien passé.

J'ai rencontré un problème avec une visibilité de liaison. Je veux minimiser l'écriture de code dans le code derrière si je peux mais si c'est OBLIGATOIRE cela ne me dérange pas de le faire.

J'ai un ViewModel. Ce modèle expose un booléen et 2 commandes. Une commande connect, une commande disconnect et un booléen DeviceCurrentlyConnected.

Fondamentalement, j'ai décidé de faire 2 boutons mais ont la visibilité du bouton basé sur le booléen.

J'ai donc eu du mal avec ça. J'ai essayé des styles avec des déclencheurs pendant longtemps.

<Button Visibility="Hidden" Content="{x:Static UIStrings:ClientStrings.DeviceBar_DisconnectCommandName}" VerticalAlignment="Center" HorizontalAlignment="Center" Height="{Binding ElementName=this.Content, Path=DesiredHeight}" Margin="10" Name="Disconnect" Command="{Binding DisconnectCurrentDeviceCommand}"> 
    <Button.Style> 
     <Style TargetType="Button"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding DataCotext.DeviceConnected, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}" Value="True"> 
        <Setter Property="Visibility" Value="Visible"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 

Je n'arrive pas à faire fonctionner les styles du tout.

Fondamentalement, la fonctionnalité que je veux est:

DeviceConnected = false: Afficher un bouton contenu Connect et commande lié à la ConnectCommand.

DeviceConnected = true: Affiche un bouton avec une déconnexion de contenu et une commande liée à DisconnectCommand.

pour qu'un bouton soit affiché et lié au périphérique de connexion alors qu'aucun périphérique n'est actuellement connecté et qu'un bouton soit affiché lorsqu'un périphérique est connecté à la commande de déconnexion et qu'il dise le mot déconnexion.

+0

La liaison est-elle destinée à être {{Binding DataCotext.DeviceConnected ...} 'ou est-ce une faute de frappe? c'est-à-dire, pas '{Binding DataContext.DeviceConnected ...}'. –

+0

Votre droit. Ce devrait être DataContext. Mon code actuall est correct cependant: P. –

Répondre

2

Écrivez un bool au convertisseur de visibilité, puis utilisez le convertisseur sur vos boutons. Five minute recipe for a decent BoolToVisibilityConverter est un bon article à lire sur la création/utilisation d'un convertisseur de visibilité.

Ce que j'ai fait dans le passé est d'utiliser un convertisseur bool to visibility et de passer la propriété IsEnabled du bouton comme paramètre au convertisseur. Comme le bouton est désactivé/activé par la commande dans le modèle avec la méthode CanExecute, vous pouvez utiliser la propriété IsEnabled pour définir la visibilité du bouton avec le convertisseur.

1

La raison pour laquelle votre déclencheur ne fonctionne pas est que le style est remplacé par l'attribut sur le bouton lui-même.

Vous pouvez utiliser un convertisseur de métro Schtroumpf suggère, sinon, vous pouvez déplacer l'attribut de visibilité dans le style de telle sorte que la gâchette fonctionne correctement

Il suffit d'ajouter:

<Style.Setters> 
    <Setter Property="Visibility" Value="Hidden" /> 
</Style.Setters> 

le style puis retirez l'attribut.