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 :

[TabItem] Comment gérer correctement les RoutedMessages sur un overrided ?


Sujet :

Windows Presentation Foundation

  1. #1
    Membre expérimenté
    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
    Points : 1 313
    Points
    1 313
    Par défaut [TabItem] Comment gérer correctement les RoutedMessages sur un overrided ?
    bonjour

    j'ai override un tabitem pour faire le miens qui doit reccup des routed messages

    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
     
        //---------------------------------------------------------------------------
        #region TabItemLeveled
        //---------------------------------------------------------------------------
        public class TabItemLeveled : TabItem
        {
            //---------------------------------------------------------------------------
            private LeveledControler _LeveledControler = new LeveledControler();
            //---------------------------------------------------------------------------
            public TabItemLeveled()
                : base()
            {
                _LeveledControler.Reset();
                this.AddHandler(BaseLeveledUserControl.LevelChangedEvent, new LevelChangedEventHandler(_LevelChanged));
            }
            //---------------------------------------------------------------------------
            private void _LevelChanged(object sender, LevelChangedEventArgs e)
            {
                this._LeveledControler.Set(e.LeveledTransition);
                this.Background = new LevelToColorConverter().Convert(this._LeveledControler.Level, null, null, null) as System.Windows.Media.Brush;
            }
            //---------------------------------------------------------------------------
        }
        //---------------------------------------------------------------------------
        #endregion
        //---------------------------------------------------------------------------
    le cote etonnant de la chose c'est que le nouveau tabitem ne recois les message que l'orsque on a cliqué une fois dessus sinon il ne recois rien

    y'a pas une tite solution pour regler ca

    en fait pour etre plus precis j'ai le sentiment qu'il ne fait le binding des composants, se trouvant sur l'onglet que l'orsque l'on a au moins clique une fois dessus ....
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  2. #2
    Membre expérimenté
    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
    Points : 1 313
    Points
    1 313
    Par défaut [TabControl] dans un tabcontrol
    j'ai paufiné mon approche
    j'ai donc un tab control dans un autre tab control

    la hierarchie etant la suivante
    • tabcontrol (A)
      • tabitem (1)
      • tabitem (2)
      • tabitem (3)
        • tabcontrol (B)


    le tab control B etant binde sur une source de type collection

    je constate avec déplaisir qu'il ne binde en fait les objets se trouvant dans le content des tabitem de B que lorsque ceux ci sont selectionnés

    comment peut t-on forcer le binding

    j'ai meme constate que c'etait la meme chose pour un tacontrol tt seul quand il est bindé sur un itemsource
    il ne bind effectivement les source des onglets que lorsque que l'on est dessus

    voici un exemple qui demontre le soucis (avec un seul tabcontrol)
    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
     
    <TabControl ItemsSource="{Binding Source={StaticResource Personnes}}"
                        Margin="10,343,12,212" Name="tabControl4" TabStripPlacement="Left" 
                        >
                <TabControl.ItemTemplate>
                    <DataTemplate>
                        <Label Content="{Binding Nom}" />
                    </DataTemplate>
                </TabControl.ItemTemplate>
                <TabControl.ContentTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Vertical">
                            <Label Content="{Binding Nom}" />
                            <Label Content="{Binding Prenom}" />
                            <TextBox Text="{Binding Prenom}" TextChanged="textBox1_TextChanged" />
                        </StackPanel>
                    </DataTemplate>
                </TabControl.ContentTemplate>
            </TabControl>
    quand on change d'onglet le message textboxchanged est appelé, or si le binding etait fait des le depart on aurait pas ce comportement ...

    et dans le cas particulier d'un binding sur un itemsource il ne cree pas tout les objets , mais bind au changement d'onglet sur les objet du template ...
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  3. #3
    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
    C'est dingue mais... j'ai absolument rien compris

  4. #4
    Membre expérimenté
    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
    Points : 1 313
    Points
    1 313
    Par défaut
    en fait c'est relativement simple
    je croyais que quand tu prenais un tabcontrol avec un itemsource bindé sur une collection et que tu faisais un template pour les items
    il chargeais l'ensemble des item pour chaque tabitem
    or
    manifestement d'apres ce que je constate, il ne cree qu'un seul template d'objet et il binde l'element reel du seul tabitem selectionné


    par exemple
    j'ai un tacontrol bindé sur une collection de personnes (dans lequel on trouvera sur chaque personne un nom et un prenom)

    sur un tab item j'ai (definition dans le template)
    un label bindé sur nom
    et
    une textbox sur prenom

    si tu clique sur le tab item 1
    tu aura le binding effectif seulement sur l'element 1 de ta collection (nom et prenom)
    si par exemple tu change le prenom de la deuxieme personne dans la collection il ne se passe rien

    c'est seulement quand tu cliquera sur le tabitem 2 que l'element 2 de ta collection est bindé sur le label et sur la liste box (l'element 1 etant manifestement plus bindé)

    ainsi si tu voulais remonter des infos ce n'est pas possible de la faire par le biais de l'interface graphique, tu es oblige de le faire dans l'objet metier ...

    en fait je n'avais pris compris comme ca le fonctionnement du tabcontrol .. ca s'avere etre deroutant, mais ca semble etre fait pour optimiser le graphisme, on ne binde a priori dans ce cas la que ce qui est "visible"....

    toi y'en avoir compris ?
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    En fait, le VisualTree d'un TabControl ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TabControl
    + Grid
      + Border (ContentPanel)
        + ContentPresenter (PART_SelectedContentHost)
      + TabPanel (HeaderPanel)
        + TabItem
        + TabItem
        + TabItem
        ...
    Tu peux le voir facilement avec un visualiseur comme Mole

  6. #6
    Membre expérimenté
    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
    Points : 1 313
    Points
    1 313
    Par défaut
    oui merci mais c'est plus le comportement focntionnel que je n'avait pas compris en fait

    au depart je pensais que si tu avais sur chaque tab item (dans le cas d'une collection bindé) des elements il y avait reelement une instanciation de ceux ci
    or je constate que ce n'est pas le cas
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  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 ikeas Voir le message
    si par exemple tu change le prenom de la deuxieme personne dans la collection il ne se passe rien
    Ca ressemble a un problème de INotifyPropertyChanged qui n'est pas implémenté ca...

  8. #8
    Membre expérimenté
    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
    Points : 1 313
    Points
    1 313
    Par défaut
    en fait j'ai la reponse
    ce que je ne savaist pas de wpf pour les tab item (dans le cas oou tu utilise un template de representation) c'est que le malin (wpf) n'instancie pas les objets du template plusieurs fois

    en fait il les instancie une fois, et binde sur l'objet contenu dans la tabitem
    si tu change de tab item il debinde l'objet du tab item precedant des objets de representation et binde l'objet du tabitem selectionné sur les objet du template

    un test simple permet de le constater
    tu met dans le template une listbox et tu mappe le message text changed ...
    tu verra ce que je veux dire

    quoi qu'il en soit j'ai decouvert un autre probleme lié au binding sur les tab non selectionné ...

    bref et pour conclure, il fait au niveau du binding une sorte de "binding tardive" en fonction du besoin visuel reel...
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

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

Discussions similaires

  1. [VB6] Gérer correctement les connexions winsock
    Par Xdrei dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 25/03/2006, 12h57
  2. Réponses: 2
    Dernier message: 16/03/2006, 19h07
  3. [.NET 2.0] Comment gérer correctement des sockets ?
    Par MattC dans le forum Framework .NET
    Réponses: 2
    Dernier message: 08/02/2006, 16h31
  4. comment utiliser correctement les sessions?
    Par cladsam dans le forum Langage
    Réponses: 5
    Dernier message: 06/02/2006, 11h56
  5. Réponses: 5
    Dernier message: 06/09/2005, 16h18

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