12
votes

Comment changer la visibilité d'une commande de WPF à partir de ViewModel

J'ai une application WPF où essayé de mettre en œuvre MVVM Modèle et Prism 2. J'ai un usercontrol qui a souscrit à un événement tiré d'un autre USERCONTROL. Je voudrais basculer de la visibilité de quelques éléments d'enfants dans le contrôle de l'abonnement. Les événements sont tirés correctement, même je suis en mesure de connecter des données à certains éléments. Comment puis-je lier une visibilité ou une propriété de style à ce sujet avec la viewModel et les modifier de manière dynamique.


0 commentaires

3 Réponses :


27
votes

Vous pouvez avoir une propriété booléenne dans votre viewModel et lier cette propriété à la propriété de visibilité de vos contrôles. Puisque vous allez assointer une valeur booléenne et que la propriété de visibilité attend une valeur de dénombrement de la visibilité, vous devrez utiliser le BooleantVisivibilitéConverter Convertisseur Pour faire la conversion,

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

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


1 commentaires

D'une manière ou d'une autre ça n'a pas marché pour moi. J'ai déclaré convertisseur dans la section USERCONTROL.RESOURCES et utilisé les liaisons que vous avez expliquées dans le commentaire.



10
votes

Bien que l'ajout d'une propriété booléenne et utilisant un convertisseur de valeur fonctionne, je vous recommanderais d'ajouter une propriété de type visibilité à votre viewModel, par exemple

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


4 commentaires

Bien que cette réponse soit élégante, il y a un problème avec cela. Si le programme change DOITHOIMAGE , ce changement n'est pas envoyé à la vue.


C'est vrai, mais il y a quelques façons de gérer le problème. Vous pouvez soit gérer l'événement PropertyChased à partir de DoitHOfImage et sur un nouvel événement Bangked ou uniquement autoriser l'accès à DépendezhImage à travers une propriété wrapper qui soulève des événements pour les deux propriétés.


Je peux voir deux choses en cours ici, (i) Je déciderai de décider si quelque chose est vrai ou faux (qui semble approprié pour un VM de faire) et (ii) je prends cette valeur booléenne et décider si un contrôle doit être visible ou non ( Ce qui semble approprié pour la vue. J'aurais pensé qu'utiliser un convertisseur ici serait idéal en termes de maintien de la limite V / VM propre.


@Peteh, la différence entre un mode de vue et un modèle est que le point de vue est concerné par ce qui est affiché dans la vue. Sans cette logique dans la viewModel, vous avez juste un modèle. En outre, il est très facile de tester l'élément sur la vue devient visible lorsque le booléen change si la logique est dans la machine virtuelle.



2
votes

Il y a une solution simple pour les personnes qui rencontrent cette question.

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

dans votre xaml , lie-à-lui comme suit: xxx

Maintenant, à partir de votre modèle de vue, vous pouvez définir showModifybuttons sur visibilité.Collapté ou visibilité.visibilité.visible au besoin.


0 commentaires