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

C# Discussion :

WPF Datatemplate et DataContext


Sujet :

C#

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Par défaut WPF Datatemplate et DataContext
    Bonjour,

    J'ai actuellement créer une fenêtre en wpf.

    Hors depuis celle-ci je n'arrive pas à accéder au DataContext.

    J'utilise l'approche Model First.

    Le datacontext est donc relié de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        <DataTemplate DataType="{x:Type ViewModel:DroitGroupeViewModel}">
            <View:DroitGroupeView />
        </DataTemplate>
    Mais dans le constructeur de la vue je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DroitGroupeViewModel VM = (this.DataContext as DroitGroupeViewModel);
    Mais dans ce cas VM est null...

    Comment faire pour accéder à ce que je veux ?

    Merci pour votre aide.

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Datatemplate, c'est pour représenter une donnée (en gros). la propriété DataType c'est pour dire quel type de donnée le DataTemplate va représenter. Si tu ne mets pas de x:key, ce template va être utilisé automatiquement pour le type de donnée que tu as spécifié.

    Ca n'a rien à voir avec le VM, pour ça, tu va devoir l'assigner toi-même.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Par défaut
    Ma question est pourquoi dans ce code je suis obliger d'utiliser le loaded ?

    Car il s'agit du constructeur de la classe qui est relié au datatemplate.

    Dans ce cas le ViewModel devrait être accessible via le dataContext hors dans le constructeur ce n'est pas le cas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      public partial class DroitGroupeView : UserControl
        {
            public DroitGroupeView()
            {
     
                InitializeComponent();
                this.Loaded += (sender, e) => { (this.DataContext as DroitGroupeViewModel).loadDataGrid(GroupeFonction); }; // Cela fonctionne
     
                //DroitGroupeViewModel VM = (this.DataContext as DroitGroupeViewModel); | Cette partie ne marche pas !!
               //VM.loadDataGrid(this.GroupeFonction);                                                | 
     
            }
        }

  4. #4
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    C'est difficile sans voir le système en entier. Tu utilises un framework MVVM particulier?
    La Datacontext n'apparait pas tout seul, je suppose qu'il y a un framework quelque part qui instancie ta classe DroitGroupeView et lui assigne ensuite le VM comme Datacontext ensuite. Ce qui fait que dans le constructeur le datacontext est null, alors que dans le loaded il ne n'est pas car l'assignation se fait juste après avoir construit l'instance.

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Par défaut
    Dans mon cas il n'y a pas de framework...

    La personne passée avant moi a fait sont propre système.


    Pour faire simple :

    • En premier lieu je dispose de la classe menu dans lesquelles les liens sélectionnés sont tracés pour savoir lequel a été cliqué et donc quel type de ViewModel doit être retourné.
    • Lorsque je clique sur l'un d'eux cela déclenche une action static du conteneur(MainContainerViewModel) afin de modifier la page Courante
    • Suite à diverses vérifs le conteneur courant est setter.
    • Tous mes ViewModel héritent de BaseViewModel qui contient un object de type DataTemplate Template




    J'appelle donc en premier une méthode ExecuteNaviguerVers qui créé mon instance à mettre en place de la manière suivante :

    Code : 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
     
    private void ExecuteNavigerVers()
            {
                    if (MainMenuViewModel != null)
                    {
                        MainMenuViewModel.MainMenuItemSelected = Parent;
                    }
     
                    BaseViewModel BVM = Activator.CreateInstance(VMType) as BaseViewModel; //C'est ici que l'instance du ViewModel cible est créé (VMType me donne le type de ViewModel)
     
                    if (string.IsNullOrEmpty(BVM.Titre))
                    {
                        BVM.Titre = Libelle;
                    }
     
                    MainContainerViewModel.NavigerVers(BVM);
                }

    Qui appelle NavigerVers qui me permet de vérifier que la valeur n'est pas null :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      public static void NavigerVers(BaseViewModel ViewModel)
            {
                if ((Courant != null)&&(ViewModel != null))
                {
                    Courant.PageSuivante(ViewModel);
                }
            }

    Et pour finir la méthode pageSuivante qui permet de définir la page courante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void PageSuivante(BaseViewModel ViewModel)
            {
     
                IsForwardNavigationMode = false;
     
                PageCourante = ViewModel; //fenêtre qui est changé. (ici ViewModel.Template est toujours null)
     
            }
    En dehors de tout ça je n'arrive pas à détecter à quel moment je set le context...


    Et donc dans mon fichier ResourceDictionary j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <DataTemplate DataType="{x:Type ViewModel:DroitGroupeViewModel}">
            <View:DroitGroupeView />
        </DataTemplate>
    Pour être plus précis j'ai donc créé un exemple que je rajoute en pièce jointe.
    Si l'on essaye d'accéder au dataContext dans le constructeur de la vue on se rend compte que celui-ci est null..
    Fichiers attachés Fichiers attachés

  6. #6
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    OK je vois un peu mieux le truc. C'est la moteur XAML qui crée le datatemplate pour les VM et puis qui assigne le datacontext.

    C'est normal que le datacontext soit null dans le constructeur, on ne peut assigner une propriété (genre DataContext) que si l'objet est crée => après être passé dans le constructeur.

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Par défaut
    Je n'ai donc pas le choix d'utiliser le loaded.

    Merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WPF] DataTemplate et IValueConverter: "type inconnu" ?!
    Par Invité dans le forum Windows Presentation Foundation
    Réponses: 22
    Dernier message: 03/05/2010, 18h26
  2. [WPF] Datatemplate & Tabcontrol
    Par NeoKript dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 01/04/2010, 19h13
  3. [WPF] ajouter dynamiquement un control dans un dataTemplate.
    Par maa dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 28/02/2008, 08h20
  4. [WPF] datatemplate acces aux controls
    Par MrCyprom dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 21/09/2007, 16h17
  5. [WPF] ControlTemplate - DataTemplate - Style ?
    Par PlaTyPuSs dans le forum Windows Presentation Foundation
    Réponses: 23
    Dernier message: 10/05/2007, 13h52

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