CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

WPF/MVVM?

Odvie
Odvie
Niveau 10
28 août 2014 à 22:50:34

Sali salut.

Donc j'me suis lancé y'a pas longtemps dans le WPF, c'est très bien, Winforms ça commençait à faire vieillot, tout ça tout ça.

Sauf que voilà, jusque là je l'utilise comme du winforms, or il semblerait que la norme soit au MVVM.

Le problème étant que j'ai pas réussi à trouver un tuto ou un truc du genre qui m'explique CLAIREMENT tous les concepts (multibinding? ICommand? J'met quoi dans mon ViewModel au final? C kwa 1 datacontext en MVVM? :doute: ).

Si vous avez un truc qui propose la création pas à pas d'un projet complet abordant le tout, je vous en serais très reconnaissant, et vous récompenserais avec un message vocal aux notes tropicales :hap: .

JoResta
JoResta
Niveau 10
29 août 2014 à 10:28:46

Salut,

le mvvm est simplement un design pattern, il n'a rien d'obligatoire. Cela dit c'est assez epic une fois qu'on maîtrise plus ou moins la bête. Je crois qu'il n'existe pas vraiment de tuto complet à son sujet, j'ai moi même galéré quand je cherchais des infos. Il y a cependant un mec Laurent Bugnion (le développeur de MVVM Light) qui a fait une série de vidéo, il parle beaucoup de son framework mais sa éclair pas mal sur la façon de procédé, d'ailleurs une vois que tu sauras te débrouiller avec ce pattern je te conseil MVVM Light pour tes projets.

Faut aimer l'anglais par contre :
http://channel9.msdn.com/Blogs/kreekman/TechDays-2010-Understanding-the-Model-View-ViewModel-pattern

Je t'expliquerai bien le tout mais c'est vraiment long pour tout décrire. Mais je pense que la base est simple, tu as trois couches, le Model, qui représente tes données, la View qui représente ton interface, et le View Model qui fait le lien entre les deux. Le but étant de garder le tout séparé afin de faciliter l'écriture et la maintenance du code. La règle dit la vue ne doit connaitre que le View Model, le View Model ne doit connaitre que le Model. Donc Le Model ne connais rien d'autre et ne doit dépendre de rien d'autre que lui même. Le View Model lui est conçu pour exposer les propriétés à la vue, mais il ne la connais pas.

Avant de continuer un peu il faut aussi savoir que WPF est entièrement basé sur le principe MVVM, par exemple Blend de Microsoft a été entièrement codé sur ce principe. Ce que je veut dire c'est que le Binding et le DataContext sont utile que si tu utilise MVVM. Biensure je pense qu'on peut se débrouiller autrement en faisant les choses un peu plus a l'arrache mais sa perd de son charme.

Le DataContext représente en quelque sorte la source de donnée pour la vue. Donc techniquement ce sera toujours un View Model. En liant un DataContext a la vue, la vue a accès à toutes les propriétés du View Model grâce au Binding. Pour faire un exemple de raisonnement (sans code) :

Imaginons qu'on a un ViewModel avec une propriété nommé TextA, dans le constructeurs, tu l'initialise et tu lui donne comme valeur "Coucou". Notre View Model s'arrête la. Attention a bien mettre get;set; à la propriété. (le set n'est pas obligatoire dans notre exemple).

Notre vue est une simple fenêtre, je vais lui donné comme DataContext notre View Model. A partir de la, dans la mesure ou c'est ma fenêtre qui détient le DataContext, toutes les choses que je vais ajouté dans celle ci (qui seront donc "enfant" de la fenêtre) pourront accéder à mon View Model grâce au Binding.
Dans cette fenêtre on ajoute un TextBox, le TextBox à une propriété Text ou l'on peu écrire le texte a afficher. Mais nous on préfère qu'il affiche le "Coucou" de notre ViewModel. Donc on va écrire la chose suivante (oui j'ai dit pas de code mais bon ^^)

<TextBox Text="{Binding TextA}"/>

Comme on a pas donné de DataContext directement dans le TextBox il va chercher plus haut dans la hierarchie(les parents) un DataContext valide, et il trouvera celui de notre fenêtre qui est notre View Model, il va y chercher une propriété TextA qu'il va également trouvé et va donc afficher "Coucou".

Alors tu pourras dire tous ce bordel pour juste afficher du texte...Alors oui mais la puissance du binding n'est pas vraiment exploiter dans cette exemple. Je vais pas faire trop long encore, mais par exemple il y a l'interface INotifyPropertyChanged, qui permet de rafraîchir automatiquement la vue SI la donnée a changé, sans que tu n'es rien d'autre a faire. Et déjà ca c'est du luxe. INotifyPropertyChanged peut aussi servir a d'autre fin, il déclenche un event donc tu peux imaginer toute sorte de chose avec ca.

Je vais essayer de faire très court pour les Commands. Elles sont utiles car dans le MVVM, et comme je te disait au départ la vue connait le View Model, mais le View Model ne connait pas la Vue. Le View Model est conçu pour fonctionner même sans Vue (c'est ce qu'on appel View Model First). Il est donc logique qu'il faut trouver une solution lorsque l'utilisateur appuie sur un bouton. Car appuyer sur un bouton ca se passe dans la vue, mais l'action et dirigé par le View Model. Donc pour résoudre se problème on utlise des command, il en existe de plusieurs type, et chacun fait plus ou moins comme il le souhaite. Une command doit forcement intégrer l'interface ICommand, ce qui rend possible le binding avec la propriété Command des Buttons par exemple. En appuyant sur le bouton, la Command va donc déclencher une action dans le ViewModel sans que le View Model n'est eu besoin de connaitre la vue (et ca c'est la classe^^).

Je vais arrêter la, j'ai fait long et je sais même pas si c'est clair pour toi tous ca. Je te conseil fortement de persévérer dans ce domaine, WPF est vraiment une chouette techno même si un peu galère a comprendre. Et c'est regrettable qu'il n'y est pas plus de tuto clair la dessus.

Bon courage et n'hésite pas a poser tes questions.

UItraxion
UItraxion
Niveau 10
29 août 2014 à 10:43:05

Le ViewModel c'est la classe qui va s'occuper de faire transiter les données de ta couche modèle vers tes vues.

L'idée derrière c'est de bien séparer tes couches, et de faire en sorte qu'une vue n'ait pas à s'occuper des données que tu affiches à l'écran. Elle doit simplement les afficher, quelque soit la manière.

Donc dèja :

-Pas de Code-Behind dans les .cs de tes vues (ou très peu, et seulement si c'est impossible de faire autrement)
-Pas de contact direct entre ta vue, tes données et ton view-model.
-Pas de valeur en dur dans ton XAML (ca depend lesquelles, si c'est un titre c'est pas grave, mais même la tu verras qu'un appel sur un fichier .resx fera mieux l'affaire)
-Un ViewModel par vue

Pour faire transiter des données entre ton ViewModel et ta vue, tu vas utiliser le DataBinding. Ca consiste à lier la valeur d'une propriété dans ton XAML à celle d'une autre declarée dans le ViewModel en question. De ce fait, si la valeur de la propriété dans ton ViewModel change, ce changement se répercute aussi sur la vue. Tu peux configurer le bind, de façon à ce que le changement se produise d'un coté ou des deux cotés. Tu peux aussi binder des commandes, de façon à specifier l'action qui doit être accomplie lorsque tu cliques sur un bouton. Par conséquent, la méthode appelée se trouvera aussi dans ton VM, et non en CodeBehind.

Cependant, il faut que ta vue ait connaissance de cette fameuse classe qui va lui servir de ViewModel. Par consequent, tu vas devoir initialiser son DataContext en lui indiquant quel VM utiliser. Il y a plusieurs façon de le faire, à toi de voir.

Personnellement, je te conseille fortement d'utiliser MVVM Light après l'avoir intégré à Visual Studio. Tu pourras générer un projet WPF avec l'architecture dèja préparé, et des exemples très explicites, dèja présents dans ton code. Personnellement j'ai trouvé ça super pour comprendre plusieurs choses. Comme par exemple le fait de faire un ViewModelLocator, qui n'est rien d'autre qu'une classe qui va te permettre de renvoyer les instances de tes VM au sein de ton projet. Comme ça lorsque tu fais une vue, tu utilise ce ViewModelLocator pour initialiser le DataContext de ta vue.

Il y a juste trop trop trop trop de ressources bien expliquées sur Internet pour pouvoir passer à coté. Trop de façons différentes de faire aussi. C'est difficile de plonger en détail dans le sujet. Mais tu as l'idée générale de MVVM.

UItraxion
UItraxion
Niveau 10
29 août 2014 à 10:51:35

Sinon juste petit oubli : MVVM n'est pas la norme. C'est juste une design pattern, une façon de structurer ton programme.

C'est pas adapté à 100% des projets, mais c'est vraiment dommage de passer dessus. Le DataBinding est extrêmement puissant et les ViewModels apportent une flexibilité non égalée à ton programme.

Mais il faut avouer que c'est super chiant de s'y mettre au début...

Odvie
Odvie
Niveau 10
29 août 2014 à 11:15:32

Apparemment y'a des gens qui se font assassiner s'ils n'utilisent pas le pattern MVVM dans leurs projets WPF :hap:

(virtuellement bien sûr :noel: )

Le truc c'est que j'ai un Wizard (rpz le Extended Toolkit), et que pour gérer le IsEnabled du bouton Next, je dois check 50 controls avec leur 50 event handlers, c'est UN PEU lourd :hap: .

Et j'ai aucune idée de comment implémenter ça en MVVM. Enfin, si, j'ai une vague idée, on m'a donc parlé de multibinding ou mieux, de ICommand.

M'enfin, j'vais déjà zieuter les vidéos du Bugnion quand j'aurai le temps, on verra après.

UItraxion
UItraxion
Niveau 10
29 août 2014 à 11:18:49

Bah disons que pour WPF en entreprise, dèja MVVM c'est un petit peu la base :noel:

De toute façon MVVM ou pas, si tu mets des données directement dans ton XAML ou en Code-Behind, c'est sur à 100% que tu mérites de mourir :noel:

Odvie
Odvie
Niveau 10
29 août 2014 à 20:37:57

Ou alors que j'ai pas le temps d'apprendre le MVVM :noel:

Et puis c'est un peu illogique ta phrase, grosso modo ça se traduit en "MVVM ou pas, si tu utilises pas une View, un Model et un ViewModel, tu mérites de mourir" :rire: :hap:

UItraxion
UItraxion
Niveau 10
30 août 2014 à 00:34:04

Non je pense qu'il existe plusieurs design pattern qui permettent une séparation des couches. Et beaucoup :)

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment