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 :

Erreur de Binding dans une listBow


Sujet :

Windows Presentation Foundation

  1. #1
    Membre éprouvé

    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 65
    Par défaut Erreur de Binding dans une listBow
    Bonjour à tous,

    Voici le contexte avant d'exposer mon problème.

    En classe, nous devons faire un jeu de plateau, basé sur Eternity II (pour ceux qui connaissent). Je vais donc disposer d'un jeu de pièces, à positionner sur un plateau.

    Avant de déplacer les pièces, celles-ci sont disponibles pour l'utilisateur dans une listebox. Le contenu de cette listebox suit un binding.

    Voici une présentation générale du code :

    Ma classe de fenêtre principale est appelée Display.

    Voici un bout de son code :

    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 Display : Window
    {
    public Master master;
     
    public Display()
    {
    this.InitializeComponent();
     DataContext = this.master;
     
      master = new Master(4, this);
      }}
    Voici maintenant ce qu'on trouve dans la classe Master :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Master
        {
            //...
            protected List<Piece> _AllPiecesNotPlaced;
     
            public List<Piece> AllPiecesNotPlaced { set { _AllPiecesNotPlaced = value; } get { return _AllPiecesNotPlaced; } }
    Quand j'appui sur le bouton "commencer le jeu", j'appel une méthode contenue dans la classe Master, à l'intérieure de cette méthode, je rempli ma liste ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach (int i in _PiecesData)
    { 
     _AllPiecesNotPlaced.Add(new Piece(i, @"Data\Img\Original\"));
    }
    Voici comment est définie en partie ma classe Piece :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     public class Piece
    {
     //...
    private ImageSource _img;
     
    public ImageSource Image { get { return _img; } }
     
    public Piece(int Tid, string imgPath)
      {
    //...
    _img = new BitmapImage(new Uri(imgPath, UriKind.RelativeOrAbsolute));
    //...
    }
    A l'aide de breackpoints, j'ai bien vérifié, ma liste contient bien les élèments voulus et je ne pense pas qu'il y ait de soucis par rapport à cela.

    Par contre je pense que ca vient de mon binding que j'effectue comme ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <ListBox 
            Name="ImageList" 
            Grid.Column="0" Grid.Row="0" Grid.RowSpan="18"
            ItemsSource="{Binding AllPiecesNotPlaced}" 
            ItemTemplate="{StaticResource ListImagesTemplate}" />

    Mon template est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <Window.Resources>
            <DataTemplate x:Key="ListImagesTemplate">
                <StackPanel>
                    <Image Source="{Binding Image}" Width="30" Height="30"/>
                </StackPanel>
            </DataTemplate>
        </Window.Resources>
    Le problème est que ma listebox reste toujours vide. Quelqu'un saurait-il me dépanner.

    Si je n'ai pas été assez précis dans mes explication ou mon code, dites le moi

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    soit tu bind le datacontext apres l'avoir rempli
    soit tu utilise comme list<> une observablecollection<> qui notifira au bnding les changements (ajout, suppresion etc)

  3. #3
    Membre éprouvé

    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 65
    Par défaut
    Bonjour,

    En fait oui je bind en "dur" dans mon xaml et à l'execution du programme la liste est vide, elle ne se remplie que quand j'appuie sur un bouton, du coup comme elle est vide au départ c'est pour ca que ca merde ?

    Comment je fais pour binder en C# et pas en xaml du cou p ?

    merci

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    deja utilise une observable collection

    si tu veux binder en xaml
    il faut :
    - ajouter un segment ressource dans ta fenêtre par exemple (mais tu peux le mettre en recoures presque dans tous les composants) avec une clef
    - mettre la ref de l'assembly dans l'entête
    - binder avec un {staticresource clef}

    exemple

    imagine une classe toto se trouvant dans l'assembly courant dans l'espace de nom
    namespace toto.class
    (avec l'intelisens tu tape xmlns:local= et il te proposera les assembly et les espace de nom possible)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <Window x:Class="MainWindow"
    ....
        xmlns:local="clr-namespace:toto.class"
    .....
        >
        <Window.Resources>
     
            <local:toto x:Key="keytoto"/>
        </Window.Resources>
    .....
    la a la création de la fenêtre il crée l'objet toto (bien sur fo avoir un constructeur vide ou pas de constructeur)

    apres tu peux reccup l'object dans le code avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    toto t = this.Resources["keytoto"] as toto;
    apres tu en fait ce que tu veux lol

    maintenant passont au binding dans le xaml
    pour une liste par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     DataContext="{StaticResource keytoto}"
                      ItemsSource="{Binding}"
    ou
    ItemsSource="{Binding Source={StaticResource keytoto}}"
    par exemple tu peux regarder sur mon blog comment mapper une enumeration sur une liste box

  5. #5
    Membre éprouvé

    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 65
    Par défaut
    Merci de la réponse, cependant je n'arrive toujours pas :s.

    J'ai essayé plein de choses, mais ca ne fonctionne pas.

    Ma liste reste désepérement vide ^^

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    met un projet exemple ici je le regarderais

  7. #7
    Membre éprouvé

    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 65
    Par défaut
    Merci beaucoup .

    J'ai rajouté le fichier sur mon skydrive

    http://cid-f4ab530aa9ca608f.skydrive.../Eternity2.zip

    Avec les explications données dans le premier post tu devrais pouvoir t'y retrouver.

    C'est un peu "brouillon" certes, mais c'est la première fois que je fais un projet aussi ambitieux donc j'ai un peu de mal à m'organiser.

    Merci.

Discussions similaires

  1. erreur mysql-fetch_array dans une boucle While
    Par carmen256 dans le forum Requêtes
    Réponses: 2
    Dernier message: 13/04/2006, 17h15
  2. [8i][PL/SQL] erreur avec lpad dans une fonction
    Par sali dans le forum Oracle
    Réponses: 3
    Dernier message: 16/03/2006, 06h22
  3. Réponses: 6
    Dernier message: 29/11/2005, 19h36
  4. Erreur d'agrégation dans une requête UNION
    Par soso78 dans le forum Access
    Réponses: 2
    Dernier message: 05/10/2005, 00h11
  5. Erreur de syntaxe dans une requete
    Par linou dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/08/2005, 12h44

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