2009-08-23 8 views
4

J'apprends MVVM à travers un projet et je suis resté coincé sur quelque chose de simple. J'ai un Button qui met à jour un ListView. J'ai un command dans le ViewModel qui fait les bonnes choses, mais je veux sélectionner la nouvelle ligne et mettre l'accent sur un TextBox après avoir cliqué sur le Button.MVVM Quelle est la manière de mettre à jour une interface utilisateur après une commande?

La question est: Comment puis-je mettre à jour mon interface utilisateur après l'exécution d'une commande?

Si j'ai besoin de changer le titre de mes fenêtres lorsqu'une opération a été faite, j'utilise une propriété sur le ViewModel qui est liée au titre de la fenêtre et elle est changée quand j'en ai besoin, mais je ne sais pas se concentrer sur un contrôle lorsqu'une commande a été exécutée.

Merci.

Répondre

2

Pour sélectionner la nouvelle ligne, ajoutez une nouvelle propriété à votre ViewModel (« SelectedItem » par exemple), et lier la propriété ListView SelectedItem lui:

<ListView ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}">... 

Dans le ViewModel, il vous suffit d'attribuer le nouvel élément à la propriété SelectedItem

pour concentrer la zone de texte, l'idée de Mike semble un bon

0

En ce qui concerne la mise au point du contrôle dans le code: textBox.Focus() Je considère que tout ce que vous mentionnez dans votre question est une logique GUI, donc j'ajouterais un événement Click au bouton pour gérer les choses qui doivent Happend dans l'interface graphique.

Espérons que cela aide.

+0

Oui j'ai essayé, mais si vous avez la commande et l'événement à la fois sont exécutés. L'événement sera exécuté avant la commande (c'est ce que j'ai vu). J'ai besoin que l'événement soit exécuté après la commande parce que je dois placer le foyer quand la commande fait son travail. Si je supprime la commande dans le bouton et que je l'exécute dans l'événement, j'ai perdu la chose CanExecute parce que CanExecute fonctionne si la commande est attachée au contrôle. –

+0

Avez-vous besoin d'appeler la commande à partir de XAML? Tu ne peux pas l'appeler depuis l'événement Click? Obtenir la commande du datacontext et l'exécuter à partir de là? – Fossmo

+0

Comme je l'ai dit, si j'appelle la commande de l'événement click, j'ai perdu la chose CanExecute. –

0

Je pense que vous devez utiliser le motif Mediator. S'il vous plaît voir ceci:

Josh Smith's Mediator Prototype for WPF Apps

Ceci est généralement utilisé dans la communication avec la vue de la vue-modèle. J'espère que cela t'aides.

1

Vous pouvez faire un comportement attaché. Je suggère d'utiliser le nouveau framework de comportement de Blend, à savoir TriggerAction qui contient cette logique personnalisée.

Pour votre comportement joint vous mettez sur le bouton, donnez-lui un DP pour un ICommand et peut-être un DP d'un type ListView. Sur la "Invocation prioritaire protégée (paramètre d'objet)" de votre TriggerAction, exécutez votre ICommand, puis faites référence à votre ListView. Ici vous pouvez faire votre code personnalisé, comme la mise au point.

Votre XAML peut ressembler à ceci:

<Button> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Click"> 
     <Behaviors:CustomBehavior Command="CommandName" ListView="{Binding ElementName=myListView}" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
<Button/> 

Je suggère regarder le comportement de ExecuteCommandAction de Mike Brown (download here), il est sur presque 1/2 de ce que vous avez besoin.

0

Dans votre cas, vous avez besoin que le ViewModel informe la vue qu'il doit définir le focus sur un contrôle spécifique. Cela peut être fait avec une interface IView. La vue implémente cette interface et ViewModel peut appeler une méthode de la vue sur cette interface.De cette façon, vous avez toujours les View et ViewModel découplés les uns des autres.

Comment cela peut être fait est montré ici:

WPF Application Framework (WAF)

http://waf.codeplex.com

Questions connexes