10
votes

Comment puis-je changer le visuel dans une vue de la vue?

Je suis nouveau dans WPF et MVVM. Je pense que c'est une question simple. My ViewModel effectue un appel d'Asynch pour obtenir des données pour un DataGrid qui est liée à une observation d'observa dans la vue. Lorsque les données sont chargées, j'ai défini la propriété ViewModel appropriée et le DataGrid affiche les données sans problème. Cependant, je souhaite introduire une queue visuelle pour l'utilisateur que les données sont en cours de chargement. Ainsi, à l'aide de mélangement, j'ai ajouté ceci à mon balisage: xxx pré>

i pense em> Je sais comment changer l'état dans mon code-derrière (quelque chose de similaire à celui-ci) : P>

VisualStateManager.GoToElementState(LayoutRoot, "HistoryLoaded", true);


0 commentaires

3 Réponses :


2
votes

Ce que j'ai fait dans le passé est de déclarer un événement dans mon VM à laquelle la vue s'abonne. Ensuite, lorsque je veux indiquer que l'indicateur occupé devrait disparaître, je soulevais l'événement à l'intérieur du VM.


1 commentaires

Une propriété est meilleure qu'un événement pour cela.



12
votes

La manière standard de procéder est normalement de disposer d'une propriété dans votre viewModel (une propriété de dépendance ou une participation à InotifyPropertyChanged) qui signifierait que les données sont en cours de chargement - peut-être Bool IsloadingData ​​Code> ou similaire. Vous l'avez défini sur true lorsque vous commencez à charger, et définissez-le sur FALSE lorsque vous avez terminé.

Ensuite, vous liez un déclencheur ou un état visuel à cette propriété dans la vue et utilisez la vue pour décrire comment présenter la manière de présenter à la page utilisateur que les données sont en cours de chargement. P>

Cette approche maintient la séparation dans laquelle la vue ViewModel est la em> la représentation logique em> la vue de l'utilisateur et n'a pas besoin de participer à l'affichage réel - ou avoir une connaissance des animations, des états visuels, etc. p>

Pour utiliser un DataStateBehavior pour modifier les états visuels en fonction d'une liaison à Silverlight: P>

<TheThingYouWantToModify ...>
 <i:Interaction.Behaviors>
   <ei:DataStateBehavior Binding="{Binding IsLoadingData}" Value="true" TrueState="HistoryLoading" FalseState="HistoryLoaded" />
 </i:Interaction.Behaviors>
</TheThingYouWantToModify >


2 commentaires

J'aime cette approche. Désolé d'être tellement ignorant, mais comment lier-tu un état visuel à une propriété?


Je crois que c'est différent entre Silverlight et WPF 4. Cependant, dans SL4, vous pouvez utiliser le DataStateBehavior ou un DataStatesWitchBehavior - pas beaucoup d'exemples là-bas, mais suffisamment pour commencer. Vous nommez vos états visuels et ajoutez des nœuds d'interaction.Behavior aux commandes cibles avec un magasin de données de données afin de passer à l'état visuel nommé déclenché sur une propriété liée.



7
votes

Vous pouvez faire quelque chose comme ceci:

xaml xxx

code: xxx

------------------------- Code mis à jour -------------------------- -

xaml xxx

modèle xxx

élément personnalisé xxx


2 commentaires

C'est une technique intéressante. Merci. Je peux y aller à cet itinéraire - mais je veux d'abord voir si je peux en quelque sorte changer la visualisation de la vue en fonction d'une modification de la propriété ViewModel. Je pense que c'est la seule façon dont je puisse faire l'animation - comme la fondu et les aboutissants basés sur l'état.


J'ai utilisé la propriété de visibilité ici, mais ce que vous pouvez faire est dans votre contrôle personnalisé, créez une propriété de dépendance de type Boolean, de lier la propriété isbusy à cette propriété et de modifier l'état visuel dans le contrôle lui-même lorsque la propriété change sur une valeur.