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 :

[MVVM] Fermer une fenêtre (sans code behind)


Sujet :

Windows Presentation Foundation

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Août 2010
    Messages : 188
    Points : 129
    Points
    129
    Par défaut [MVVM] Fermer une fenêtre (sans code behind)
    Bonjour

    Le sujet a première vu a l'air bête.
    Tout en gardant le model MVVM pour mon application j'aimerai pouvoir fermer un fenêtre.
    La difficulté: aucun code behind contrairement à l'exemple ci-dessous
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
     
            MainWindow window = new MainWindow();
            var viewModel = new MainWindowViewModel();
            viewModel.RequestClose += window.Close;
            window.DataContext = viewModel;
     
            window.Show();
        }
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public class MainWindowViewModel : ViewModelBase
    {
        RelayCommand _closeCommand;
        public ICommand CloseCommand
        {
            get
            {
                if (_closeCommand == null)
                {
                    _closeCommand = new RelayCommand(
                       param => Close(),
                       param => CanClose()
                       );
                }
                return _closeCommand;
            }
        }
     
        public event Action RequestClose;
     
        public virtual void Close()
        {
            if ( RequestClose!=null )
            {
                RequestClose();
            }
        }
     
        public virtual bool CanClose()
        {
            return true;
        }
    }

    Est-ce faisable ?

    (ps: contrairement a l'exemple ci-dessus, mon DataContext est définit dans le code XAML)
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <Window.DataContext>
        <core:viewModel />
    </Window.DataContext>

    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Citation Envoyé par Monkey56 Voir le message
    La difficulté: aucun code behind contrairement à l'exemple ci-dessous
    Déjà le code que tu montres n'est pas vraiment du code-behind, dans la mesure où ce n'est pas le code d'une vue mais celui de l'objet Application. D'autre part, MVVM ne veut pas dire "pas de code-behind" ! Il y a plein de cas où le code-behind est la bonne approche, et le cas que tu montres en est un exemple type. Tu peux mettre tout ce que tu veux dans le code-behind, du moment que ça ne concerne que l'UI (et éventuellement la communication entre la vue et le ViewModel) ; ça ne "casse" pas le pattern MVVM. La seule contrainte, c'est que le ViewModel ne doit pas dépendre de ce code-behind : le ViewModel doit pouvoir fonctionner indépendamment de la vue (donc pas de logique métier dans le code-behind)

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Août 2010
    Messages : 188
    Points : 129
    Points
    129
    Par défaut
    Du coup je vais reformuler ce que j'aimerai faire, si cela est possible bien évidement.

    D'une part mon DataContext, je préfère le définir dans le XAML, pour une raison bien précise: J'ai remarquer que Visual Studio est plus souple quand le DataContext est définir dans le XAML plutôt que dans du code C# (par exemple une valeur Bindé est visible dans l'éditeur de fenêtre ou UserControle). Du coup je me suis forcé et ai pris l'habitude de définir ici ce DataContext. Je ne sais pas s'il s'agit de la meilleur solution mais moi je préfère.

    De ce fait j'aimerai éviter la solution mis en avant précédemment, éviter tout code dans mes fichier Window.xaml.cs.
    Malgré que je pourrait écrire un code comme ci-dessous:
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ViewModelBase viewModel = this.DataContext;
    viewModel.RequestClose += this.Close;

    Y aurait-il donc une autre solutions pour dire a une fenêtre de ce fermer, action exécuter dans mon ViewModel; un peu comme utiliser RequestClose() dans n'importe quelle méthode de mon ViewModel?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Tu peux toujours faire un behavior pour gérer ça, comme ça tu n'auras à écrire le code qu'une seule fois, et tu n'auras qu'à setter une propriété attachée en XAML pour "activer" le comportement

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/01/2011, 10h17
  2. MVVM : Fermer une fenêtre enfant sans code-behind !
    Par GregLeOuf dans le forum Windows Presentation Foundation
    Réponses: 13
    Dernier message: 11/12/2010, 13h16
  3. Réponses: 4
    Dernier message: 21/04/2010, 12h06
  4. Déplacer, réduire, fermer une fenêtre sans bordure
    Par Stefounette dans le forum JavaFX
    Réponses: 6
    Dernier message: 15/04/2010, 19h34
  5. Fermer une fenêtre sans confirmation
    Par ZACKX dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 30/04/2007, 09h55

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