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![]()
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.
Responsable Java de Developpez.com (Twitter et Facebook)
Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
--------
Architecte Solution
LinkedIn : https://www.linkedin.com/in/nicolascaudard/
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
Des avis ?
Pourquoi est-ce la vue qui reçoit l'id et non pas le ViewModel ?
Les règles du forum
Le trio magique : FAQ + Cours + fonction rechercher
Mes articles
Pas de questions par messages privés svp
Software is never finished, only abandoned.
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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![]()
Responsable Java de Developpez.com (Twitter et Facebook)
Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
--------
Architecte Solution
LinkedIn : https://www.linkedin.com/in/nicolascaudard/
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.
Responsable Java de Developpez.com (Twitter et Facebook)
Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
--------
Architecte Solution
LinkedIn : https://www.linkedin.com/in/nicolascaudard/
Thomas LEBRUN: MCAD.NET, MCTS (Win et Web), MCPD(Win et Web) & Microsoft MVP Client Application Development
WPF par la pratique, mon livre sur WPF ! (également disponible ici ou là)
A la découverte de .NET
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 listview
Code : Sélectionner tout - Visualiser dans une fenêtre à part <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 tempsCa 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)
Thomas LEBRUN: MCAD.NET, MCTS (Win et Web), MCPD(Win et Web) & Microsoft MVP Client Application Development
WPF par la pratique, mon livre sur WPF ! (également disponible ici ou là)
A la découverte de .NET
Bon ca fait plaisir de voir qu'on pense pareil
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 : Sélectionner tout - Visualiser dans une fenêtre à part <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 xml : Sélectionner tout - Visualiser dans une fenêtre à part <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
Est-ce qu'un Binding de ce type marche:
où UC serait le nom de ta vue où tu as chargé ton DataContext
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part <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![]()
Les règles du forum
Le trio magique : FAQ + Cours + fonction rechercher
Mes articles
Pas de questions par messages privés svp
Software is never finished, only abandoned.
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
Merci pour les conseils c'était très instructif![]()
Partager