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 :

DataGrid et binding sur des propriétés de navigation (entities) : problème de rafraichissement


Sujet :

Windows Presentation Foundation

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut DataGrid et binding sur des propriétés de navigation (entities) : problème de rafraichissement
    Bonjour,

    Mon problème intervient avec un modèle Entity Framework, mais je pense que ce doit être la même chose avec de simples objets.
    Je cherche à afficher dans une datagrid les éléments d'une table qui contient des références à d'autres objets (propriétés de navigation).
    Pour ces objets, je souhaite afficher la désignation et non l'identifiant.
    La saisie est réalisée à l'extérieur de la grille.
    En clair : je cherche à afficher dans la liste des Imputations.
    Une Imputation possède :
    - une propriété Date
    - une propriété Durée (numérique)
    - une propriété Personne

    Personne est une autre entité possédant :
    - un identifiant
    - un nom

    Dans ma grille, je souhaite afficher le nom et non l'identifiant de la personne.
    Je réalise donc un binding :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <DataGridTextColumn Binding="{Binding Path=Presonne.Nom, Mode=OneWay}" />
    Au chargement, tout se passe comme prévu le nom est bien affiché.

    Si je modifie (panneau de saisie à l'extérieur de la grille dont le datasource est le même que la grille) la date ou la durée, les modifications sont rafraichies automatiquement dans la grille.
    Par contre, si je modifie la personne, pas de rafraichissement de la nouvelle valeur.
    La valeur est bien prise en compte : si j'affiche dans la grille l'identifiant, il est modifié.
    Par ailleurs, le simple fait de réaliser un tri sur la grille rafraichit les valeurs.

    Donc pour résumer, il doit y avoir quelque chose à faire pour dire à la grille de mettre à jour les valeurs obtenues par "navigation", mais quoi ?

    Merci d'avance...

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    En fait, le problème ne survient pas uniquement pour les datagrids :
    Si je crées un textbox avec le même binding, il n'est pas rafraichi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBox Text="{Binding Path=Personne.Nom}"  />
    Pas plus que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBox Text="{Binding Path=Personne.ID}"  />
    Par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBox Text="{Binding Path=IDPersonne}"  />
    est rafraichi.

    Le symptome est donc évident... mais je n'ai pas de solution !

  3. #3
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Tes objets implémentes bien INotifyPropertyChanged ?

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 97
    Points : 106
    Points
    106
    Par défaut
    Salut,
    J'ai fait le test suivant qui marche très bien :

    Classe Personne :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public class Personne : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChanged(String info)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(info));
                }
            }
     
            private string _name = "toto";
            public string Name
            {
                get
                {
                    return this._name;
                }
                set
                {
                    if (value != this._name)
                    {
                        this._name = value;
                        NotifyPropertyChanged("Name");
                    }
                }
            }
        }
    Classe Imput:
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    public class Imput : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChanged(String info)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(info));
                }
            }
     
            private int _id = 5;
            public int Id
            {
                get
                {
                    return this._id;
                }
                set
                {
                    this._id = value;
                    NotifyPropertyChanged("Id");
                }
            }
     
            private Personne _pers = new Personne();
            public Personne Pers
            {
                get
                {
                    return this._pers;
                }
                set
                {
                    this._pers = value;
                }
            }
        }
    Mon Vue-modèle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class VM
        {
            public Imput Imputation { get; set; }
     
            public VM()
            {
                Imputation = new Imput();
            }
        }
    Mon xaml:
    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
     <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
     
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
     
            <TextBlock Text="{Binding Imputation.Id}" TextAlignment="Center" />
            <TextBlock Text="{Binding Imputation.Pers.Name}" TextAlignment="Center" Grid.Column="1" />
     
            <Button Content="Clic me!" Grid.Row="1" Grid.ColumnSpan="2" Width="100" Height="30" Click="Button_Click" />
        </Grid>
    Mon code behind (moche mais c'est juste pour simuler le changement de nom):
    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
    public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
                DataContext = new VM();
            }
     
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                VM dataContext = (VM)DataContext;
                dataContext.Imputation.Id = 3;
                dataContext.Imputation.Pers.Name = "tata";
            }
        }
    Ca marche si tu implémentes bien INotifyPropertyChanged comme l'a dit binoo.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    A priori oui.
    Il s'agit d'entities qui dérivent donc de EntityObject lui-même dérivant de StructuralObject qui implémente INotifyPropertyChanging et INotifyPropertyChanged.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci à tous et désolé pour le dérangement.
    En fait, c'est un bug de la DataGrid qui ne se redessine pas, mais si je bouge l'ascenceur les valeurs sont bonnes.
    Pour ce qui est de ma textbox, c'est bisard, mais bon...

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

Discussions similaires

  1. Problème de binding sur les propriété IsEnabled des boutons
    Par Alterans dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 06/12/2014, 11h29
  2. binding sur une propriété shared (vb) static (c#) ?
    Par Pol63 dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 24/06/2009, 15h44
  3. Binding sur une propriété avec paramètre
    Par FRED.G dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 17/11/2008, 18h38
  4. [Databinding] bind sur une propriété d'une collection
    Par herveb dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 11/12/2007, 10h35
  5. [2005] Datagrid et binding sur proc. stockée ?
    Par cedric_g dans le forum Windows Forms
    Réponses: 11
    Dernier message: 07/08/2007, 17h03

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