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 :

[Débutant] Probleme d'affichage du binding


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 119
    Par défaut [Débutant] Probleme d'affichage du binding
    Bonjour, voila j'ai un problème avec mon application web en WPF/Silverlight.
    J'ai créé ma classe Service , avec comme attributs, code et designation, elle herite de la classe INotifyPropertyChanged.

    J'instancie donc plusieurs Service, je les ajoute dans une ObservableCollection.
    Cette derniere je l'affecte au datacontext de ItemsControl.

    Quand je compile, il m'affiche bien le bon nombre de champs correspondant au nombre de Service que j'ai ajouté à la collection. Mais les textbox n'affiche pas le contenu de l'objet.

    Voici la classe service :

    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
    39
    40
    41
    42
     
    class Service : INotifyPropertyChanged
        {
            private string _code;
            private string _designation;
     
            public string Code 
            { 
                get 
                { 
                    return this._code; 
                }
                set
                {
                    this._code = value;
                    NotifyPropertyChanged("Code");
                }
            }
     
            public string Designation
            {
                get
                {
                    return this._designation;
                }
                set
                {
                    this._designation = value;
                    NotifyPropertyChanged("Designation");
                }
            }
     
            public event PropertyChangedEventHandler PropertyChanged;
     
            public void NotifyPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this,
                        new PropertyChangedEventArgs(propertyName));
            }
     
        }
    et voici le code xaml de ma page :

    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
     
    <Page x:Class="Gesper.Page1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Page1">
        <Grid>
            <ItemsControl x:Name="Services">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="75" />
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="25" />
                                <RowDefinition Height="25" />
                            </Grid.RowDefinitions>
                            <TextBlock Grid.Row="0" Text="Code :" />
                            <TextBlock Grid.Row="1" Text="Designation :" />
                            <TextBox x:Name="TxtCode" Grid.Row="0" Grid.Column="1" Text="{Binding Code, Mode=TwoWay}" />
                            <TextBox x:Name="TxtDesignation" Grid.Row="1" Grid.Column="1" Text="{Binding Designation, Mode=TwoWay}" />
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Grid>
     
    </Page>
    et enfin le code C# de la page :

    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
     
    public partial class Page1 : Page
        {
            public Page1()
            {
                InitializeComponent();
     
                Service _service = new Service() { Code = "COghkD", Designation = "studgjghjghkjghkg" };
     
                ObservableCollection<Service> _services = new ObservableCollection<Service>();
     
                _services.Add(_service);
                _services.Add(_service);
                _services.Add(_service);
                _services.Add(_service);
                _services.Add(_service);
     
                Services.ItemsSource = _services;
            }
        }
    j'espere que vous trouverez le soucis, quand je compile, il ne m'affiche aucune erreurs.

    Merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 150
    Par défaut
    Salut,

    Pour moi, ton problème peut venir de 2 endroits.

    [EDIT]
    J'avais pas vue mais ton problème a de forte chance d'etre résolu si tu indique le binding dans ton ItemsControl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <ItemsControl x:Name="Services" ItemsSource={Binding}>
    [/EDIT]

    Dans ton Xaml rajoute le terme "Path=" dans ton Binding :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <TextBox x:Name="TxtCode" Grid.Row="0" Grid.Column="1" Text="{Binding Path=Code, Mode=TwoWay}" />
    Dans ton code behind essaye de spécifier le DataContext au lieu du ItemsSource :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Services.DataContext = _services;

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 119
    Par défaut
    J'ai effectué les changements que vous m'avez proposé, mais sa ne change rien au problème, les textbox sont toujours vides

  4. #4
    Membre émérite Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Par défaut
    Citation Envoyé par toham Voir le message
    J'ai effectué les changements que vous m'avez proposé, mais sa ne change rien au problème, les textbox sont toujours vides
    Hello,

    Je viens de tester ton code dans une appli WPF et il fonctionne correctement !

    As-tu des messages d'erreurs dans la fenêtre de sortie ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 119
    Par défaut
    Non je n'ai aucune erreur, arf je ne pense pas que se soit une reference qui manque car il y aurait je pense forcement une erreur.
    Je sais plus quoi faire

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 150
    Par défaut
    Juste comme ca assure toi que ton projet qui contient le xaml est bien un WPFApplication. Au pire recréer toute ta solution et copie colle le code.

    J'avais eu des surprises avec des contrôles ou le template du generic.xaml n'était pas chargé et c'etait due a ma librairie qui n'etait pas de type WPF mais c# library.

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 119
    Par défaut
    Ba si je comprend bien, le projet doit être une application de navigateur WPF, si oui c'est bien ce que j'ai fait.

    Et il y a bien une erreur qui apparait à l'execution :

    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
     
    System.Windows.Data Error: 16 : Cannot get 'Code' value (type 'String') from '' (type 'Service'). BindingExpression:Path=Code; DataItem='Service' (HashCode=57712780); target element is 'TextBox' (Name='TxtCode'); target property is 'Text' (type 'String') MethodAccessException:'System.MethodAccessException: Gesper.Modele.Service.get_Code() ---> System.Security.SecurityException: Échec de la demande d'autorisation de type 'System.Security.Permissions.ReflectionPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
       à System.Security.CodeAccessSecurityEngine.ThrowSecurityException(Assembly asm, PermissionSet granted, PermissionSet refused, RuntimeMethodHandle rmh, SecurityAction action, Object demand, IPermission permThatFailed)
       à System.Security.CodeAccessSecurityEngine.ThrowSecurityException(Object assemblyOrString, PermissionSet granted, PermissionSet refused, RuntimeMethodHandle rmh, SecurityAction action, Object demand, IPermission permThatFailed)
       à System.Security.CodeAccessSecurityEngine.CheckSetHelper(PermissionSet grants, PermissionSet refused, PermissionSet demands, RuntimeMethodHandle rmh, Object assemblyOrString, SecurityAction action, Boolean throwException)
       à System.Security.PermissionSetTriple.CheckSetDemand(PermissionSet demandSet, PermissionSet& alteredDemandset, RuntimeMethodHandle rmh)
       à System.Security.PermissionListSet.CheckSetDemand(PermissionSet pset, RuntimeMethodHandle rmh)
       à System.Security.PermissionListSet.DemandFlagsOrGrantSet(Int32 flags, PermissionSet grantSet)
       à System.Threading.CompressedStack.DemandFlagsOrGrantSet(Int32 flags, PermissionSet grantSet)
       à System.Security.CodeAccessSecurityEngine.ReflectionTargetDemandHelper(Int32 permission, PermissionSet targetGrant, CompressedStack securityContext)
       à System.Security.CodeAccessSecurityEngine.ReflectionTargetDemandHelper(Int32 permission, PermissionSet targetGrant)
    L'action qui a échoué était*:
    Demand
    Le type de la première autorisation qui a échoué était*:
    System.Security.Permissions.ReflectionPermission
       --- Fin de la trace de la pile d'exception interne ---
       à System.Reflection.MethodBase.PerformSecurityCheck(Object obj, RuntimeMethodHandle method, IntPtr parent, UInt32 invocationFlags)
       à System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
       à System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
       à System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
       à System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
       à MS.Internal.Data.PropertyPathWorker.GetValue(Object item, Int32 level)
       à MS.Internal.Data.PropertyPathWorker.RawValue(Int32 k)'

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 119
    Par défaut
    Bon, ba je reviens avec quelques nouvelles.
    La première est que j'ai réussi a binder une textbox sans liaison à une classe.

    Page1.xaml.cs
    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
     
    public partial class Page1 : Page
        {
            public string Nom { get{return "Emile Zola";}}
     
            public Page1()
            {
                InitializeComponent();
     
                this.Loaded += new RoutedEventHandler(Page1_Loaded);
     
     
            }
     
            void Page1_Loaded(object sender, RoutedEventArgs e)
            {
    //ze est la textbox
                ze.DataContext = this;
            }
        }
    Page1.xaml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBox x:Name="ze" Text="{Binding Nom, Mode=OneWay}" Height="32" Margin="0,52,12,0" VerticalAlignment="Top" />
    (et ajouter "Path" ne change rien, sa marche quand meme sans)

    Voila, avec ce code je visualise bien Emile Zola dans la texbox.

    J'ai donc voulu créer une classe, ici adh (adherent). Sans la faire hériter de INotifyPropertyChanged, car la je test juste la visualisation, on vera la modification en mode TwoWay plus tard.

    Voici le code :

    adh.cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class adh : 
        {
            private string _Nom;
     
            public string Nom
            {
                get { return _Nom; }
                set { _Nom = value; }
            }
        }
    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
     
     public partial class Page1 : Page
        {
            adh _adherent;
     
            public Page1()
            {
                InitializeComponent();
     
                this.Loaded += new RoutedEventHandler(Page1_Loaded);
     
     
            }
     
            void Page1_Loaded(object sender, RoutedEventArgs e)
            {
                _adherent = new adh() { Nom = "Emile Zola" };
                ze.DataContext = _adherent;
            }
        }
    Le code xaml ne change pas.

    Bon ba voila, c'est la que tout va mal, il n'affiche plus rien dans la texbox, je deviens un "peu" fou, au début je me suis dit que je manquais de connaissance en WPF car je débute, j'ai donc arrété de continuer mon projet et décider de faire une petit TP pour m'entrainer, j'ai donc ouvert mon bouquin sur le WPF et le silverlight.
    J'ai réussi a afficher le contenu d'une List<adh> dans une listbox. Mais impossible de binder une autre composant.

    Voila, je suis bloqué .

    Merci d'avance

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 150
    Par défaut
    Il faut que tu bind ta classe a l'element parent de ta TextBox et ca devrait marcher.
    De plus si je me trompe pas ta classe est en private rajoute public devant et vire les ":" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class adh 
        {
            private string _Nom;
    
            public string Nom
            {
                get { return _Nom; }
                set { _Nom = value; }
            }
        }

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

Discussions similaires

  1. Probleme d'affichage datagrid Binding
    Par toams69 dans le forum Silverlight
    Réponses: 5
    Dernier message: 16/08/2011, 15h14
  2. probleme d affichage de donnees, débutant
    Par prugne dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 29/06/2010, 18h09
  3. [Débutant] Probleme d'affichage dans une listbox
    Par toham dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 20/03/2010, 13h15
  4. Probleme d'affichage (débutant)
    Par chungo_007 dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 06/01/2008, 17h04
  5. [débutant] Probleme d'affichage
    Par mavina dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 01/12/2005, 18h36

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