2009-09-12 7 views
8

J'ai une application WPF où j'ai essayé d'implémenter le modèle MVVM et Prism 2. J'ai un Usercontrol qui a souscrit à un événement déclenché par un autre Usercontrol. Je voudrais basculer la visibilité de quelques éléments enfants dans le contrôle d'abonnement. Les événements sont déclenchés correctement, même si je réussis à lier des données à certains éléments. Comment puis-je lier la visibilité ou toute propriété de style avec le ViewModel et les modifier dynamiquement.Comment modifier la visibilité d'un contrôle WPF à partir de ViewModel

Répondre

23

Vous pouvez avoir une propriété booléenne dans votre ViewModel et lier cette propriété à la propriété Visibility de vos contrôles. Étant donné que vous asigning une valeur booléenne et la propriété de visibilité attend une valeur d'énumération de visibilité, vous devrez utiliser le convertisseur BooleanToVisibilityConverter pour effectuer la conversion,

<Style.Resources> 
    <BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" /> 
</Style.Resources> 

<Image Visibility="{Binding Path=ShowImage, 
        Converter={StaticResource booleanToVisibilityConverter}}"/> 

Hope this helps.

Ezequiel Jadib

+0

D'une certaine manière, cela n'a pas fonctionné pour moi. J'ai déclaré le convertisseur dans la section Usercontrol.Resources et utilisé les liaisons comme vous l'avez expliqué dans le commentaire. – Raj

+1

Désolé mon erreur. Cela marche. Je vous remercie. – Raj

8

Bien que l'ajout d'une propriété booléenne et en utilisant un convertisseur fonctionne de valeur, je recommande l'ajout d'une propriété de type de visibilité à votre ViewModel, par exemple

public Visibility ImageVisibility 
{ 
    get { return shouldShowImage ? Visibility.Visible : Visibility.Collapsed } 
} 

L'avantage de cette méthode, vous est ne pas besoin d'écrire un convertisseur pour chaque propriété que vous souhaitez exprimer d'une manière visuelle (par exemple, pour un niveau de stock qui devient rouge étiquette quand il tombe en dessous de 10, Vous pouvez avoir un convertisseur que vous utilisez une fois ou simplement exposer une propriété StockLabelBrush de votre machine virtuelle)

+0

Bien que cette réponse soit élégante, il y a un problème. Si le programme change 'shouldShowImage', cette modification n'est pas envoyée à la vue. – James

+1

C'est vrai, mais il y a plusieurs façons de gérer le problème. Vous pouvez gérer l'événement 'PropertyChanged' à partir de' shouldShowImage' et déclencher un nouvel événement 'PropertyChanged', ou seulement autoriser l'accès à' shouldShowImage' via une propriété wrapper qui déclenche des événements pour les deux propriétés. – Darren

1

Je sais que c'est une vieille question, mais il y a une solution simple pour les personnes qui rencontrent ce problème et trouvent cette réponse.

Dans votre modèle de vue, créer une "visibilité" propriété comme ceci:

public Visibility ShowModifyButtons 
    { 
     get { return (Visibility)GetValue(ShowModifyButtonsProperty); } 
     set { SetValue(ShowModifyButtonsProperty, value); } 
    } 
public static readonly DependencyProperty ShowModifyButtonsProperty = 
     DependencyProperty.Register("ShowModifyButtons", typeof(Visibility), typeof(FileMatchViewModel), 
     new UIPropertyMetadata(Visibility.Collapsed)); 

Dans votre XAML, se lient à elle comme ceci:

<Button Focusable="False" Content="Save" Width="100" Margin="10" Visibility="{Binding ShowModifyButtons}"/> 

Maintenant, à partir de votre modèle de vue, vous peut définir ShowModifyButtons à Visibility.Collapsed ou Visibility.Visible selon les besoins.

Questions connexes