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. P>
3 Réponses :
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}}"/>
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.
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 } }
Bien que cette réponse soit élégante, il y a un problème avec cela. Si le programme change DOITHOIMAGE CODE>, 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 code> à partir de
DoitHOfImage CODE> et sur un nouvel événement Bangked code> ou uniquement autoriser l'accès à
DépendezhImage CODE> à 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.
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: p> dans votre xaml , lie-à-lui comme suit: p> Maintenant, à partir de votre modèle de vue, vous pouvez définir showModifybuttons code> sur
visibilité.Collapté code > ou
visibilité.visibilité.visible code> au besoin. p> p>