Bonjour,
J'aimerai binder un Event de ma View a une Command de mon ViewModel (Loaded pour ce coup ci).
Est ce qu'il y a des techniques pour ça ?
Merci :)
Version imprimable
Bonjour,
J'aimerai binder un Event de ma View a une Command de mon ViewModel (Loaded pour ce coup ci).
Est ce qu'il y a des techniques pour ça ?
Merci :)
Mon topic exposait le même problème :
http://www.developpez.net/forums/d77...mandes-souris/
Il faut utiliser un genre de pattern décorateur (behavior) pour implémenter les fonctionnalités des Event et donc qu'ils correspondent à des ICommand.
ok merci !
Je commence a me demander si mon approche est bonne par contre ...
Je veux initialiser ma vue avec un ID (on va dire que c'est une vue d'édition d'objet).
Donc j'aimerai créer ma vue via un constructeur "public MaVue(Guid id)"
et remonter cet Id dans le ViewModel.
Je pensais copier ca vers le viewModel dans le constructeur de la vue (un truc du style (DataContext as MonViewModel).ObjectID = id) et ensuite cet id pourrait être utilisé dans le view model une fois l evenement Loaded levé ...
Mais finalement, ca me parait super crade :aie:
Des avis ?
Pourquoi est-ce la vue qui reçoit l'id et non pas le ViewModel ?
Euhhhh je ne comprend pas ?
Passer des ViewModel en argument de la construction d'une vue ? ca se fait ça ?
Pour le moment j'ai toujours instancié un viewmodel de cette façon :
Comment je vais pouvoir remplacer ce code si je passe mon ViewModel en argument de mon constructeur ?Code:
1
2
3
4
5
6
7 <UserControl.Resources> <viewmodels:GraphMarkPartViewModel x:Key="ViewModel" /> <views:GraphMarkLinesConverter x:Key="GraphMarkLinesConverter" /> </UserControl.Resources> <UserControl.DataContext> <Binding Source="{StaticResource ViewModel}"/> </UserControl.DataContext>
Euh je ne sais pas si ma façon est la bonne mais je n'initialise pas de ViewModel via la Vue.
Dans mon cas c'est la classe principal qui créée mon ViewModel. La Vue n'a pas à connaître le ViewModel, elle doit juste se binder sur le DataContext courant. Evidement ce DataContext courant est le ViewModel.
A confirmer tout ce que je viens de dire bien sur :D
bas si tu le passe en argument du constructeur de ta vue elle a quand même conscience de son existence...
De plus comment tu instancie des vue en pure XAML de cette façon ?
Et sinon j'aime bien mettre le modelView en resource ca permet de le retrouver facilement même quand t'es "perdu" au sein d une listview
Je ne comprends pas vraiment ta question. La vue a dans le meilleure des cas aucun code behind donc oui elle peut être instanciée en XAML pure (dans le meilleur des cas bien sur).
Je suppose que tu connais ce lien : http://japf.developpez.com/tutoriels...-et-testables/
Je me suis directement inspiré de celui-ci. Il répondra peut être mieux que des explications.
je disais ca en rapport avec ce que The_badger_man disait... si la vue a un constructeur avec un argument ViewModel, je vois pas comment la construire en pure XAML.
Ensuite l'avantage de le mettre en resource c'est que cela me permet de faire ce genre de manipulation :
En effet une fois dans un listview on ne peut plus récupérer les command du viewmodel car le datacontext est mappé aux objets de l'itemsource de la listviewCode:<Button Content="Ajouter une ligne" Command="{Binding AddLineCommand, Source={StaticResource ViewModel}}" CommandParameter="{Binding}"/>
Ok donc tu crée ta vue, tu la "pose" dans ton UI et tu créé ton viewmodel en lui passant en argument la vue, le view model se charge ensuite de se mettre dans le datacontext de la vue. J'ai bon ?
Ca me plait moyennement j'ai l'impression que ca "casse" le MVVM mais d'un autre coté ca me semble aussi le plus efficace ... je vais surement partir dans cette optique
Exact :)
C'est vrai que moi aussi, ca me plait moyennement. De plus, je me dit que les ViewModel doivent-être le plus indépendant possibles (donc ne pas référencer la vue si possible). Donc maintenant, j'essaye si possible d'éviter au maximum (et on peut y arriver la plupart du temps ;) )Citation:
Ca me plait moyennement j'ai l'impression que ca "casse" le MVVM mais d'un autre coté ca me semble aussi le plus efficace ... je vais surement partir dans cette optique
Bon ca fait plaisir de voir qu'on pense pareil :ccool:
Par contre vu que je n'ai plus mon ViewModel en resource mais juste dans le datacontext de la vue, est ce que vous pouvez m'aider a corriger mes boutons de ma listview ?
J'ai tenté de mettre mon viewmodel dynamiquement dans les ressources mais bon comme ici le systeme de récupération est "StaticResource" cela ne fonctionnent pas ... et dans la propriété source d'un binding on ne peux pas mettre de DynamicResource ...Code:<Button Grid.Column="2" Content="up" Command="{Binding UpCommand, Source={StaticResource ViewModel}}" CommandParameter="{Binding}"/>
Il y a un moyen de faire pointer la source d'un binding vers le "this.DataContext" ?
Essaie ça :
Code:<Button Grid.Column="2" Content="up" Command="{Binding UpCommand}" />
Euh non ca ne peux pas marcher ... (j'ai quand même testé)
Je suis dans une listview donc le DataContext n'est plus le ViewModel mais un objet business qui ne contient pas les commandes
J'avais raté quelques infos :aie:
Est-ce qu'un Binding de ce type marche :? :
où UC serait le nom de ta vue où tu as chargé ton DataContextCode:<Button Grid.Column="2" Content="up" Command="{Binding ElementName=UC, Path=DataContext}" />
Pour le nom, tu veux dire mettre Name="UC" sur la balise usercontrol ?
Si c'est ça je dirais ... pas mieux :calim2:
C'est ce que je voulais dire. Je ne vois pas trop du coup comment corriger le binding :?
Par contre, moi je ferais un peu différemment. Vu que tes commandes s'appliquent sur les objets métier de ta ListView, je ferais un ViewModel pour les objets remplissant ta ListView. Dans ce ViewModel, tu mettrais les commandes en question et tu ne remplirais plus ta ListView avec tes objets métiers mais avec tes objets ViewModel. Et le Binding serait plus classique.
[Edit] Ouep un peu de retard pour le coup...
bin en fait j ai des objet EF qui forme un gros graphe de plusieurs entités liés entre elle (y a une listview dans une listview)
Donc injecter une armada de viewmodel au milieu de tout ça me déplait bon je crois que j ai trouvé ma piste en restant sur les ressources ... je viendrais pleurer si ca marche pas :aie:
Merci pour les conseils c'était très instructif :ccool: