7
votes

Gestion de la vue Silverlight avec MVVM

Je suis intéressé à savoir comment vous pouvez savoir comment vous traitez l'état d'affichage dans une application Silverlight avec le motif MVVM. Disons que j'ai un simple masque de recherche qui appelle asynchroneusement un service Web. Bien que la recherche soit en cours, j'aimerais changer d'interface graphique en conséquence: - Désactiver le bouton de recherche - Activer un bouton Annuler - etc

Utilisation du WPF, je pourrais créer un Datatriggiggigrigation qui se lie à une propriété dans la vue de la vue, puis apporte les modifications à l'interface graphique. Maintenant, depuis que je n'ai pas de datrrought dans Silverlight, quelle serait la manière la plus judicieuse de réaliser cela de la même manière à la Datatriggigriggigriggyrigrite (NEAT Code, au même endroit)?

( J'ai posté une question similaire, mais elle a été formulée mal )


0 commentaires

4 Réponses :


7
votes

Ma façon standard de procéder est d'exposer une propriété "ViewState" à partir du modèle de vue (normalement une énumération). La vue se lie ensuite à la propriété et utilise le VisualStaTeManager pour passer aux états visuels appropriés en fonction de l'ENUM.

Le DataStatesWitchbehavior à partir du Les échantillons d'expression sont un bon exemple sur la façon de passer à la commutation à des états visuels. P>

edit fort> en réponse au commentaire p>

premier off , Lorsque vous traitez avec des visites, utilisez le mélange (personne ne devrait être obligé d'écrire cela beaucoup de XAML à la main). Je crois que c'est même sur tout (le plus?) Des abonnements MSDN. P>

Utilisation des états visuels commence par Visual State Manager P>

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup x:Name="GroupOne">
        <VisualState x:Name="Normal"/>
        <VisualState x:Name="Searching"/>
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>


2 commentaires

Alors, puis-je définir les états visuels sur mon contrôle (aussi sur un enfant pour enfants?), Puis allumez-les à l'aide des datastateswitchbehavior? Par exemple, un État pourrait être "Recherche de la recherche". Comment puis-je utiliser ensuite le VSM pour désactiver le bouton de manière à ce qu'il ne s'agisse pas de cliquant pendant que le contrôle est dans "Recherche"?


Merci graeme. J'ai ceci pour travailler dans un exemple de projet et cela ressemble à ceci est la voie à suivre. Cependant, il semble que je semble avoir rencontré le même problème mentionné ici: Stackoverflow.com/Questtions/2118814/... . VSM ne semble pas fonctionner dans des fenêtres enfants. Je vais maintenant tout mettre dans un UserControl et faire référence à celle de la fenêtre de l'enfant. J'utilise les datatsatateswitcher que vous avez mentionné pour le rendre ViewModel.



0
votes

Le moyen le plus pratique consiste à utiliser le NuitIndicator à partir de la boîte à outils Silverlight Je suppose. Comme il masque la zone entière, vous l'appliquez, tous les boutons sont automatiquement désactivés.

Pour un bouton d'annulation, vous devez modifier le modèle NUCTIONNINICATOR S pour placer-le directement à côté de l'animation de charge que je pense.

Vous seriez alors simplement lier la propriété Isbusy Isbusy sur une propriété correspondante dans votre viewModel que vous définissez avant le chargement et la réinitialisation lorsque vous avez terminé.


0 commentaires

0
votes

Ma solution est similaire à celle de Graeme Bradbury, mais je n'utilise pas de datastateswitchbehavior, car si mon contrôle X est placé dans un panneau d'onglets (ou quelque chose de similaire) et que l'état change pendant que je suis sur un autre onglet, alors je vais Obtenez une exception («élément» non trouvé ..). Exception est lancée car mon contrôle X est déchargé pendant que je suis sur un autre onglet et des éléments à mettre à jour ne sont pas trouvés.

Voici ce que je fais: P>

dans mon modèle de vue, j'ai une propriété visuelle qui envoie un message de notification lorsqu'un état change (j'utilise boîte à outils de lumière MVVM ): p> xxx pré>

et dans mon code de mon vue derrière je suis abonnée à une notification: p>

public class XStateChangedMessage 
{
    public string CurrentState { get; private set; }

    public XStateChangedMessage (string currentState)
    {
        CurrentState = currentState;
    }
}


0 commentaires

0
votes

1) Vous pouvez créer quelque chose comme ISenableDSearch Propriété dans la vue Modèle et la liaison à la propriété ISnabled ou Visibilité de Bouton (vous aurez besoin d'un convertisseur de visibilité BOOL sur la visibilité). Créer de nouveaux états visuels uniquement pour cela n'est pas très efficace, car vos boutons ont déjà toutes sortes d'états visuels à l'intérieur pour soutenir ce comportement.

2) Jounce MVVM Framework a une très belle mise en œuvre pour soutenir les visites de ViewModel; Jounce Visual State Manager


0 commentaires