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 :

Accès à une variable membre de l'application


Sujet :

Windows Presentation Foundation

  1. #1
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut Accès à une variable membre de l'application
    Bonjour,

    J'ai défini une ObservableCollection dans le fichier Application (App.xaml.cs) de mon appli et j'aimerai l'utiliser comme source de données d'une ListBox dans ma fenêtre principale.
    Mon problème est que je ne sais pas comment accéder à cet objet depuis le XAML de ma fenêtre.
    J'ai essayé de faire du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <Window x:Class="..."
            ...
            DataContext="{Binding Source={x:Static Application.Current}}">
     
        <Window.Resources>
            <CollectionViewSource x:Key="itemsSource"
                                  Source="{Binding Path=ItemsSource, Mode=TwoWay}" />
    ...
    mais ça n'a pas l'air de fonctionner.

    Quelqu'un peut-il me dire comment faire, svp ?
    Merci d'avance.

    PS : au fait, dites-le-moi si le fait d'utiliser ma classe Application pour stocker une liste d'objets métiers est déconseillé...

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Essaye de définir, dans le App.xaml.cs, une propriété associée à ton ObservableCollection. Ensuite, essaye de te binder sur cette propriété.

  3. #3
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Justement, c'est ça la question : comment je me binde sur ma propriété ?

    J'ai bien défini la propriété dans mon App.xmal.cs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        public partial class App : Application
        {
            private ObservableCollection<ItemData> itemsCollection_m;
     
            public ObservableCollection<ItemData> ItemsCollection
            {
                get { return itemsCollection_m; }
                set { itemsCollection_m = value; }
            }
     
            [...]
    J'initialise ma collection au démarrage de mon appli en spécifiant dans mon App.xmal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <Application x:Class="Maquette1553.App"
                 ...
                 Startup="AppStartup">
    Avec la méthode AppStartUp qui me remplie ma collection avec un bon vieux code en dur pour le test.

    Et après j'essaie de faire le binding comme suit dans ma fenêtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <Window x:Class="..."
            ...
            DataContext="{Binding Source={x:Static Application.Current}}">
     
        <Window.Resources>
            <CollectionViewSource x:Key="itemsSource"
                                  Source="{Binding Path=ItemsSource, Mode=TwoWay}" />
    ...
    Mais ça ne fonctionne pas.
    Je ne sais pas comment réaliser ce binding...

  4. #4
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Tu as essayé en code-behind, avec du bon vieux C# ?

    Après dans ton App ta propriété s'appelle ItemCollection et dans ton XAML tu as mis ItemSource, mais c'est ptet pas la même.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 214
    Points : 341
    Points
    341
    Par défaut
    Effectivement en fixant le DataContext dans le code-behind, ça fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.DataContext = Application.Current;
    Personnellement, j'éviterai de mettre du code dans App.xaml.cs, sauf si c'est pour faire un test rapide. Tout le code que tu pourras mettre dedans sera difficile à tester.
    www.japf.fr mon blog sur WPF et .Net

  6. #6
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Citation Envoyé par Skyounet Voir le message
    Tu as essayé en code-behind, avec du bon vieux C# ?
    Ben non, je n'ai pas essayé. J'aurai bien aimé pouvoir le faire en XAML

    Citation Envoyé par Skyounet Voir le message
    Après dans ton App ta propriété s'appelle ItemCollection et dans ton XAML tu as mis ItemSource, mais c'est ptet pas la même.
    Ouais, ça c'est juste une erreur de recopie, parce qu'entre-temps, j'ai modifié mon prog pour créer une propriété dans ma fenêtre qui s'appelle ItemsSource et que j'affecte avec ItemsCollection, et que j'ai utilisée pour faire un binding qui marche.
    Sorry...

    Citation Envoyé par Jérem22
    Personnellement, j'éviterai de mettre du code dans App.xaml.cs, sauf si c'est pour faire un test rapide. Tout le code que tu pourras mettre dedans sera difficile à tester.
    C'est-à-dire "difficile à tester" ?
    Quel est le rôle précis de l'objet Application si on ne peut pas s'en servir pour stocker nos objets métiers ou autre ? (je n'ai pas réussi à trouver cette info)

  7. #7
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par seiryujay Voir le message
    Quel est le rôle précis de l'objet Application si on ne peut pas s'en servir pour stocker nos objets métiers ou autre ? (je n'ai pas réussi à trouver cette info)
    Son role est de stocker les ressources (type brush, styles, templates) qui doivent-être partagées par toutes les forms de l'application

  8. #8
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Par là, tu entends que c'est dans le App.xaml qu'on liste tous les ResourceDictionnary définissant les styles, brush, etc que l'on veut capitaliser, c'est bien ça ?

    Mais du coup, le fichier App.xaml.cs ne doit servir à rien à part créer la fenêtre principale, c'est bien ça ?
    C'est dommage, je pensais qu'on pouvait s'en servir comme classe principale de l'appli.
    Faut vraiment que je me trouve une doc sur les bonnes pratiques...

    Mais sinon j'ai toujours mon problème de binding

    PS : merci pour l'info sur l'App.

  9. #9
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Ca y est, j'ai trouvé, je suis un gros naze...
    Il suffisait de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <CollectionViewSource x:Key="itemsSource"
                                  Source="{Binding Source={x:Static Application.Current}, Path=ItemsCollection, Mode=TwoWay}" />
    J'avais essayé avec ElementName, mais pas avec Source...

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 28/10/2006, 19h07
  2. [POO] Problème d'accès à une variable privée
    Par Nadd dans le forum Langage
    Réponses: 8
    Dernier message: 17/09/2006, 21h43
  3. Problème d'accès à une variable
    Par khaled.mtibaa dans le forum Langage
    Réponses: 3
    Dernier message: 20/04/2006, 11h39
  4. comment récupérer une variable membre?
    Par marute dans le forum MFC
    Réponses: 4
    Dernier message: 13/04/2006, 16h11
  5. Acces à une variable-tableau de PHP
    Par Erwan21 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/02/2005, 13h55

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