IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Ouverture d'une vue


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Par défaut Ouverture d'une vue
    Bonsoir, depuis qu'on a attaqué notre nouvelle appli Wpf avec MVVM, j'ouvre mes vues de la manière suivante :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MonViewModel mvm = new MonViewModel(...);
    mvm.ShowDialog();

    Dans ma vue principale, j'ai plusieurs endroits où j'ouvre d'autres viewModel (à partir de diverses ICommand) :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MonSousViewModel1 msvm1 = new MonSousViewModel1(...);
    mvm1.ShowDialog();
     
    MonSousViewModel2 msvm1 = new MonSousViewModel2(...);
    mvm2.ShowDialog();
     
    ...

    Je savais dès le début qu'en fermant la vue (view.Close ou view.DialogResult = ...), son viewModel restait instancié et qu'on avait donc un peu de pseudo de perte mémoire.

    Maintenant, je souhaite faire rentrer ça dans l'ordre, car si j'ouvre puis ferme 10 fois une sous vue, l'appli fait 10 fois 2Mo de plus dans la ram et j'ai autant de SousViewModel qui restent instanciés pour rien .

    Donc, j'me suis dis, oki , on va juste mettre des références dans ma vue principale sur chaque sousViewModel et de les construire que pour leur première utilisation mais :

    1 : ça fait carrément augmenter la mémoire utilisée par le processus.
    2 : quand je fait un showDialog une seconde fois, ça explose en me disant grosso modo qu'il y a plus de xaml rattaché :
    "
    Impossible de définir Visibility ou d'appeler Show, ShowDialog ou WindowInteropHelper.EnsureHandle après la fermeture d'un objet Window.
    "

    Un petit conseil pour les bonnes pratiques à adopter serait le bien venu.
    Merci d'avance.

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Par défaut S'inspirer du MVC
    Salut, Il ne faut pas oublier le but du M-V-VM :
    A la base, c'est un pattern MVC mais comme on voulait aussi bénéficier du binding bi-directionnel sans violer le contrôleur, celui-ci est devenu le VM.

    Dans une application MVC, on s'adresse au contrôleur, qui déclenche l'ouverture de la vue. Dans une application M-V-VM, cela donne une méthode Show() dans la classe de VM. Celle-ci ouvre la vue (xaml) et récupère les données (en version basique).

    Je te recommande d'ailleurs, de créer une classe de base abstraite et templatée pour gérer les VM. De cette manière, tu pourras factoriser et automatiser beaucoup de code.

    Cdlt,

    Cédric

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Par défaut
    Citation Envoyé par nova-id Voir le message
    Je te recommande d'ailleurs, de créer une classe de base abstraite et templatée pour gérer les VM. De cette manière, tu pourras factoriser et automatiser beaucoup de code.
    Bonsoir, si je comprend bien l'idée c'est d'avoir une classe de base permettant de manager tous les ViewModel (instanciés) de l'application :
    Quelque-chose de ce genre :
    http://www.codeproject.com/Articles/...e-MVVM-Pattern
    ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Par défaut
    Bonjour, je viens d'intégrer le contenu de la solution proposée dans le post du lien ci-dessus.
    Ben ça marche super bien, on a la main sur chaque instanciation des "models/viewModel/vues", et donc plus de perte de mémoire avec des view et des viewmodel se baladant dans la nature en attendant qu'un petit coup de GC.Collect fasse le ménage.

    Mais bon y'a un soucis (ou une incompréhension de ma part), dans la méthode qui fait le showdialog (DialogService -> ligne 260), on affecte le viewModel de notre choix au dataContext de la vue nouvellement créée.
    Et là dans le ViewModel, je ne sais pas comment récupérer un "événement/commande/message" qui me dise :
    "ayé la vue vient d'être affectée, tu peux initialiser les truc qui doivent être initialisé après et seulement après que la vue ne soit plus à null."

    Vous avez une idée ?



    edit :
    Autre question : j'ajoute souvent des event dans les constructeurs de mes ViewModel après l'affectation de la vue au DataContext en faisant un truc du genre : this.View.composantBidule.click += ...
    Du coup c'est ça qui me gène mais bon en faisant ça je respecte probablement plus le concept MVVM ???

    Merci d'avance pour vos conseils.

Discussions similaires

  1. Ouverture d'une vue dans une autre perspective
    Par Munch dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 25/05/2010, 14h18
  2. Mauvaise vue lors de l'ouverture d'une tâche de workflow
    Par kurkLord dans le forum SharePoint
    Réponses: 4
    Dernier message: 24/03/2010, 17h31
  3. [RCP] erreur à l'ouverture d'une vue
    Par papaetoo dans le forum SWT/JFace
    Réponses: 5
    Dernier message: 29/07/2009, 11h48
  4. ouverture d'une form en fondu transparent
    Par nicholz dans le forum Composants VCL
    Réponses: 9
    Dernier message: 08/01/2003, 11h06
  5. Créer une vue pour trier une requete UNION ?
    Par Etienne Bar dans le forum SQL
    Réponses: 3
    Dernier message: 03/01/2003, 20h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo