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 :

Accéder au DataContext d'un ItemsControl depuis un style appliqué à ItemContainerStyle


Sujet :

Windows Presentation Foundation

  1. #1
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut Accéder au DataContext d'un ItemsControl depuis un style appliqué à ItemContainerStyle
    Hello,

    alors ma question est dans le titre, mais voici un exemple de code :

    Code xml : 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
            <TabControl Name="Tab1" ItemsSource="{Binding MainWorkspace.Items, Mode=OneTime}">
                <TabControl.ItemContainerStyle>
                    <Style TargetType="{x:Type TabItem}">
                        <Setter Property="Header">
                            <Setter.Value>
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="{Binding DisplayName, Mode=OneWay}"/>
                                    <!--Ici-->
                                    <Button Command="{Binding DataContext.MainWorkspace.CloseItemCommand, RelativeSource=??, Mode=OneWay}"
                                            CommandParameter="{Binding}">X</Button>
                                </StackPanel>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </TabControl.ItemContainerStyle>
            </TabControl>

    L'idée serait d'avoir un Button dans le Header d'un TabItem et d'associer une ICommand à ce Bouton.
    La ICommand à aller chercher se trouve dans le DataContext du TabControl.
    Je voudrais définir ça dans un style.

    Je trouve pas de syntaxe pour faire ça. Est-ce possible ?

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Tu as essayé un RelativeSource avec un AncestorType de type TabControl ?

  3. #3
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    Oui, en fait c'est ce que j'ai essayé en premier. Et j'en ai déduit que la hiérachie s'arrête à ce que je définis dans le style pour TabItem.Header.

    Pour être sûr de pas te dire de bêtises je reviens de tester :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    Command="{Binding MainWorkspace.CloseItemCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TabControl}}, Mode=OneWay}"
    avec la variante :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    Path=DataContext.MainWorkspace.CloseItemCommand
    Et j'obtiens ce type d'erreur :
    System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.TabControl', AncestorLevel='1''. BindingExpressionath=MainWorkspace.CloseItemCommand; DataItem=null; target element is 'Button' (Name=''); target property is 'Command' (type 'ICommand')
    Ça me paraît foutu !

  4. #4
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Si le ICommand n'est pas dynamique, par exemple un bouton de fermeture de l'onglet, tu peux le mettre en propriété statique d'une classe et lui passer en paramètre l'objet que tu veux, à priori ton TabControl si c'est pour un remove :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Command="{x:Static local:Window1.CloseCommand}"
    CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=TabControl}}">
    C'est en tout cas une méthode que j'avais trouvé pour faire un TabItem fermable et qui marche plutôt bien.

  5. #5
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    C'est une excellente idée à laquelle je n'avais pas pensé !

    Néanmoins dans mon cas j'accède à des membres d'instance d'une classe différente de celle passée en paramètre. Donc je suis un peu coincé. Je vais devoir utiliser une commande fournie par l'objet passé en paramètre. Ça reste logique mais ça m'oblige à créer une référence supplémentaire dans cet objet ou à utiliser un Mediator (je dév en MVVM).

  6. #6
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    Bon j'avais perdu tout espoir mais c'était sous-estimer mon incompétence et les possibilités de WPF !

    En fait, la syntaxe RlativeSource/FindAncestor fonctionne, mais à condition de définir l'apparence du Header non pas directement dans la propriété Header, mais dans la propriété HeaderTemplate :
    Code xml : 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
            <TabControl ItemsSource="{Binding MainWorkspace.Items, Mode=OneTime}">
                <TabControl.ItemContainerStyle>
                    <Style TargetType="{x:Type TabItem}">
                        <Style.Setters>
                            <Setter Property="HeaderTemplate">
                                <Setter.Value>
                                    <DataTemplate>                                                                   
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock Text="{Binding DisplayName, Mode=OneWay}"/>
                                            <Button Margin=Command="{Binding DataContext.MainWorkspace.CloseItemCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TabControl}}, Mode=OneWay}"
                                                    CommandParameter="{Binding}">X</Button>
                                         </StackPanel>
                                   </DataTemplate>
                                </Setter.Value>                            
                            </Setter>
                            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>                        
                        </Style.Setters>
                    </Style>
                </TabControl.ItemContainerStyle>
            </TabControl>

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/03/2007, 11h07
  2. Réponses: 3
    Dernier message: 11/12/2006, 19h27
  3. Réponses: 1
    Dernier message: 20/10/2006, 10h43
  4. Accéder au DataSet d'une form depuis une autre
    Par Lucien dans le forum Bases de données
    Réponses: 2
    Dernier message: 07/08/2006, 09h40
  5. Réponses: 1
    Dernier message: 07/07/2006, 15h56

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