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 :

Bind d'une textbox d'une usercontrol sur une Dependency property


Sujet :

Windows Presentation Foundation

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 259
    Points : 90
    Points
    90
    Par défaut Bind d'une textbox d'une usercontrol sur une Dependency property
    Bonjour, je n'arrive pas à bind la propriété text d'une textbox sur une dependency property du usercontrol. Cette propriété est pourtant bien mise à jour. Un petit coup de debuggage permet de le vérifier.
    Voici ce que j'ai fait :
    (bon j'ai pas mis tout ce que contenait chaque classe)
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
     
    public class HeuresMOMatriJour : INotifyPropertyChanged, IExtensibleDataObject
        {
     
            private int _hprod;
     
            public ExtensionDataObject ExtensionData { get; set; }
     
            public event PropertyChangedEventHandler PropertyChanged;
     
            private void NotifyPropertyChanged(String propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
            #endregion
     
     
            [DataMemberAttribute(Order = 1, IsRequired = true)]
            public int HeuresProd { get { return _hprod; } set { _hprod = value; NotifyPropertyChanged("HeuresProd"); } }
    }
     
     
        public partial class ControleFiltreRessourcesMO : UserControl
        {
            public static readonly DependencyProperty HeureMoToModifyProperty = DependencyProperty.Register("HeureMoToModify", typeof(HeuresMOMatriJour), typeof(ControleHeuresMO));
     
            public HeuresMOMatriJour HeureMoToModify
            {
                get { return (HeuresMOMatriJour)GetValue(HeureMoToModifyProperty); }
                set { SetValue(HeureMoToModifyProperty, value); }
            }
     
     Binding bindHPROD;
     
    public ControleFiltreRessourcesMO()
            {
                InitializeComponent();
     
                bindHPROD = new Binding();
                bindHPROD.Source = this.HeureMoToModify;
                bindHPROD.Mode = BindingMode.TwoWay;
                bindHPROD.NotifyOnSourceUpdated = true;
                bindHPROD.NotifyOnTargetUpdated = true;
                bindHPROD.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
                bindHPROD.Path = new PropertyPath("HeuresProd");
                this.tbHeuresProd.SetBinding(TextBox.TextProperty, bindHPROD);
            }
    }
    Edit : en faisant un debug, je m'appercoit que pour BindHPROD, la source est null et que HeureMoToModify possède bien les valeurs que je souhaite...

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Faut pas te binder sur ta DP, faut que tu te bindes sur l'objet en lui-même et que tu passes le path de ta propriété.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 259
    Points : 90
    Points
    90
    Par défaut
    Merci mais mince, j'essaye de comprendre ta réponse, mais je sais sis c'est parce que j'ai trop mangé ou trop bu ce midi, mais j'y arrive pas !

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Essaye:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bindHPROD.Source = this;

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 259
    Points : 90
    Points
    90
    Par défaut
    Merciii !! ça marche !

    j'ai fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
               bindHPROD.Source = This
                bindHPROD.Path = new PropertyPath("HeureMoToModify.HeuresProd");
    et en plus j'avais fait une erreur...copier coller power... :
    le type de ma DP ne devait pas être ControleHeuresMO mais ControleFiltreRessourcesMO ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        public partial class ControleFiltreRessourcesMO : UserControl
        {
            public static readonly DependencyProperty HeureMoToModifyProperty = DependencyProperty.Register("HeureMoToModify", typeof(HeuresMOMatriJour), typeof(ControleHeuresMO));
    //...
    }
    //replacé par : 
        public partial class ControleFiltreRessourcesMO : UserControl
        {
            public static readonly DependencyProperty HeureMoToModifyProperty = DependencyProperty.Register("HeureMoToModify", typeof(HeuresMOMatriJour), typeof(ControleFiltreRessourcesMO ));
    }
    En fait dans le fonctionnement j'ai 1 controle Pere et 2 controle fils, 1 pour le datagrid et un pour le filtrage et les modifs du datagrid.
    Donc maintenant quand que selectionne une ligne de mon datagrid (controleFils1) j'ai mon controleFils2 qui se met à jour en fonction de celle-ci.
    Et quand je modifie une propriété dans mon controleFils2 cela modifie en direct la ligne du controleFIls1.

    Par contre comme mon controleFils1 qui a le dagatrid est bindé à une observableCollection. Quand je modifie DAns controleFils1 ça modifie dans controleFils1 et dans la collection.
    Mais l'evenement CollectionChanged n'est jamais déclenché...Ca peut venir d'ou ? Merci !

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 259
    Points : 90
    Points
    90
    Par défaut
    Par contre j'au un nouveau probleme, j'ai plusieurs textbox à bind sur ma DP.
    Avec un Bind b = new bin... etc ça marche, mais des que j'en pet 2 l'appli plante au lancement. Comment il faut faire pour binder plusieurs textbox ? merci !

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Ca plante comment ? C'est quoi le message d'erreur ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 259
    Points : 90
    Points
    90
    Par défaut
    en regardant de plus pres j'ai vu que j'avais oublié la ligne binding truc = new binding()... Maintenant ça marche. sauf que j'ai encore un autre soucis...pfff

    j'ai un combobox qui a pour itemsource une liste observable. Il est bien rempli.
    Mais quand je change de ligne dans mon datagrid, ça me change bien les valeur des textbox, mais je n'arrive pas à faire afficher la valeur de de ma DP.

    j'ai testé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                bindLIGNEPROD.Path = new PropertyPath("HeureMoToModify.LigneDeProduction");
     
                this.cbligneProd.SetBinding(ComboBox.SelectedValuePathProperty, bindLIGNEPROD);
                this.cbligneProd.SetBinding(ComboBox.SelectedValueProperty, bindLIGNEPROD);
                this.cbligneProd.SetBinding(ComboBox.SelectedItemProperty, bindLIGNEPROD);
    Le texte reste désesperement vide.

    Le combobox est rempli par une liste de type "Ligne", qui a pour propriétés Nom, libellé,...
    Et la valeur que possède HeuresMoToModify est le Nom, un string donc.
    Comment je peux faire pour que le bind se passe correctement ?

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    J'ai rien compris.....

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 259
    Points : 90
    Points
    90
    Par défaut
    Désolé...

    En gros j'ai un combobox contenant une liste de lignes de production :
    nom libellé
    1 ligne 1
    2 ligne 2
    ...

    Et je voudrait que le combobox affiche la valeur l'élément HeureMoToModify.LigneProd de ma DP précédente. LigneProd étant un le nom de la ligne (1,2,...). J'essaye depuis des heures de lui faire faire ce simple truc.
    J'ai essayé les SetBinding (poste précédent) mais sans succès. La combobox ne séléctionne jamais la bonne valeur.

    Par contre si je fais this.cbligneProd.SetItemValue = "2", là ça marche.

    Je ne sais plus comment m'y prendre !

  11. #11
    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,

    Il me semble qu'il faut aussi jouer aussi avec DisplayMemberPath.

    Ça donne quelque chose comme ça (de mémoire, mais regarde sur le net les exemples de binding sur les comboBox ) :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            <ComboBox ItemsSource="{Binding Path=LigneCollection}"
                      DisplayMemberPath="Libelle"
                      SelectedValuePath="Nom"
                      SelectedValue="{Binding Path=Ligne}" />

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 259
    Points : 90
    Points
    90
    Par défaut
    j'ai essayé de le rajouter avec la même propriété aussi, sans succes

Discussions similaires

  1. Copier une image sur une feuille et la coller sur une autre feuille
    Par Hierog dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 17/03/2011, 12h21
  2. DHCP sur une @IP 1 et DNS sur une @IP 2
    Par polls dans le forum Réseau
    Réponses: 1
    Dernier message: 20/08/2010, 12h27
  3. [XL-2002] Ecouter un evenement sur une cellule et le reproduire sur une autre cellule
    Par kulnae dans le forum Macros et VBA Excel
    Réponses: 28
    Dernier message: 17/08/2009, 21h21
  4. Réponses: 3
    Dernier message: 16/04/2009, 22h17
  5. Acceder a une TextBox qui se trouve sur une Autre Form
    Par le_contact dans le forum Windows Forms
    Réponses: 15
    Dernier message: 14/04/2007, 00h10

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