2010-06-25 6 views
4

J'ai besoin fondamentalement d'une section de l'écran pour avoir une boîte "d'authentification" où, si vous êtes connecté, il affiche votre nom d'utilisateur et un bouton "changer d'utilisateur", mais si vous n'êtes pas connecté, il suffit affiche un bouton de connexion.Comment afficher différents contrôles basés sur une condition dans WPF?

Je pourrais avoir deux contrôles complètement différents, les mettre à la fois sur l'écran et lier leur propriété de visibilité à IsAuthenticated, mais j'espérais qu'il y avait quelques bonnes suggestions là-bas pour une meilleure façon.

Merci

Répondre

8

Puisque vous mentionnez la liaison de la visibilité, je vais montrer ce que j'ai fait pour résoudre un problème similaire.

Dans votre App.xaml mis

<Application.Resources> 
    <BooleanToVisibilityConverter x:Key="VisibilityOfBool" /> 
</Application.Resources> 

Pour chaque commande que vous souhaitez contrôler la visibilité par une propriété booléenne dans votre modèle de vue, vous pouvez simplement le faire.

Visibility="{Binding IsEditable, Converter={StaticResource VisibilityOfBool}}" 

Ce basculera la visibilité du contrôle basé sur IsEditable.

+0

BooleanToVisibilityConverter ... c'est trop cool. – mdisibio

3

Votre option d'avoir 2 contrôles séparés est en fait mon premier choix.

Ceci a l'avantage de vous permettre de tester vos deux contrôles de manière complète et facile. Vous pouvez facilement utiliser des déclencheurs pour changer le contrôle visible en fonction de n'importe quel critère de votre DataContext. C'est propre, simple et raisonnablement élégant.

Cela étant dit, il existe d'autres options, si vous voulez éviter cela.

Par exemple, vous pouvez utiliser un ContentPresenter pour cette zone "boîte" et lier son contenu à une propriété de votre DataContext simplement définie comme "objet". Vous pourriez alors, lors de l'exécution, le définir sur un type distinct lorsqu'il est authentifié par rapport à non authentifié. En spécifiant un DataTemplate pour chacun des types, WPF vous connectera automatiquement le contrôle approprié. (Il s'agit essentiellement d'une approche de style MVVM ViewModel-first.)

+0

J'utilise MVVM alors peut-être que cette deuxième voie est la meilleure? –

+0

@Max: J'utiliserais toujours la première route, même dans MVVM. Le seul avantage de la deuxième route est que vous n'avez jamais à charger les informations d'authentification (ViewModel pour ce "volet") jusqu'à ce que l'utilisateur est authentifié. Dans la première approche, vous avez besoin de quelque chose - même si c'est nul. Les deux méthodes fonctionnent bien, cependant. –

+1

J'aime aussi la première approche. Cependant, vous devrez probablement prendre soin de vous assurer que si une liaison change dans le contrôle "invisible", cela n'affecte pas le comportement "visible" du contrôle (ou du ViewModel en dessous). –

Questions connexes