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 :

Binding avec ElementName dans un DataTemplate


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de annalady
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 169
    Par défaut Binding avec ElementName dans un DataTemplate
    Bonjour

    Je voulais savoir s'il est possible de faire du Binding d'un élément à un autre, dans un DataTemplate.

    Je résume : j'ai un Bouton dans un DataTemplate. Je voudrais que le ToolTip de ce bouton soit égal à la SelectedValue d'une ComboBox (qui n'est pas un parent du bouton, j'ai donc utilisé ElementName et non RelativeSource)

    Voici le code XAML du bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <DataTemplate x:Key="EmployeesTemplate">
    <Button Content="Insérer">
    <Button.ToolTip>
    <ToolTip Content="{Binding ElementName=cbxDepartments, Path=SelectedValue, Converter={StaticResource StatusConverter}}" />
    </Button.ToolTip>
    </Button>
    </DataTemplate>
    (J'ai ajouté un Converter pour pouvoir débugger et voir ce qui se passe, mais mon point d'arrêt dans mon Converter n'est jamais atteint)

    Vous l'aurez deviné, cbxDepartments est la ComboBox donc je veux afficher la SelectedValue dans mon ToolTip.

    Est-ce que ce genre de chose est censé fonctionner ?

    J'ai l'impression qu'étant donné que je suis dans un DataTemplate, il n'a pas accès à la ComboBox cbxDepartments.

  2. #2
    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
    Par défaut
    Si ça fonctionne ce genre de manip.

    Et en faisant comme ça, est-ce que ça marche ?
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <DataTemplate x:Key="EmployeesTemplate">
      <Button Content="Insérer" ToolTip="{Binding ElementName=cbxDepartments, Path=SelectedValue, Converter={StaticResource StatusConverter}}" />
    </DataTemplate>

  3. #3
    Membre confirmé Avatar de annalady
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 169
    Par défaut
    Hello Binoo

    Je viens de tester ça ne fonctionne pas non plus.

    Le mieux que j'arrive à obtenir c'est un petit carré qui ne ressemble à rien



    En tous cas mon point d'arrêt n'est jamais atteint

  4. #4
    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
    Par défaut
    J'ai pas réussi à reproduire le problème... Ca marche pour cet exemple :
    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
      <Window.Resources>
        <ObjectDataProvider x:Key="odpToto"/>
     
        <l:StatusConverter x:Key="StatusConv" />
        <DataTemplate x:Key="EmployeesTemplate">
          <Button Content="Insérer" ToolTip="{Binding ElementName=Cb1, Path=SelectedValue, Converter={StaticResource StatusConv}}" />
        </DataTemplate>
     
      </Window.Resources>
     
      <StackPanel Orientation="Vertical" >
        <ComboBox x:Name="Cb1" Width="100" Height="Auto" ItemsSource="{Binding Source={StaticResource odpToto}}" SelectedIndex="0" />
        <TabControl>
          <TabItem HeaderTemplate="{StaticResource EmployeesTemplate}" >
          </TabItem>
        </TabControl>
      </StackPanel>

    Code c# : 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
    namespace WpfApplication3 {
     
      /// <summary>
      /// Interaction logic for Window1.xaml
      /// </summary>
      public partial class Window1 : Window {
     
        private ObjectDataProvider odpEmpl = null;
     
        private ObservableCollection<string> m_ObsEmpl = null;
        public ObservableCollection<string> ObsEmpl {
          get { return m_ObsEmpl; }
          set { m_ObsEmpl = value; }
        }
     
        public Window1() {
          InitializeComponent();
     
          ObsEmpl = new ObservableCollection<string>();
          ObsEmpl.Add( "Item 1" );
          ObsEmpl.Add( "Item 2" );
     
          odpEmpl = (ObjectDataProvider)this.FindResource( "odpToto" );
          if( odpEmpl != null ) {
            odpEmpl.ObjectInstance = ObsEmpl;
          }
        }
     
      }
     
     
      public class StatusConverter : IValueConverter {
        public object Convert( object o, Type type, object parameter,
                              CultureInfo culture ) {
          if( o != null )
            return o.ToString();
          else return null;
        }
     
        public object ConvertBack( object o, Type type, object parameter,
                                  CultureInfo culture ) {
          throw new NotSupportedException();
        }
      }
     
    }

    Et je passe dans le converter... Peut-être que tu peux mettre ton code pour voir

    Sinon il y avait eu un problème similaire pour un ContextMenu ici. Peut-être à faire dans l'évènement ToolTipOpening du bouton.

  5. #5
    Membre confirmé Avatar de annalady
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 169
    Par défaut
    Tu as raison le problème vient du ContextMenu !

    En fait j'avais simplifié mon problème pour l'exemple, en vérité mon bouton se trouve dans le ContextMenu d'un autre bouton.

    Si je définis le binding dans le ToolTip du bouton principal, ça fonctionne. En revanche si je le fais dans le ToolTip du buton situé dans le ContextMenu, ça foire !

    Je vais essayer de binder le bouton du ContextMenu au bouton principal(binding de binding lol)

    Merci pour ton aide

  6. #6
    Membre confirmé Avatar de annalady
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 169
    Par défaut
    Raaah la prise de tête !

    En fait le binding d'un ContextMenu vers un parent est un peu particulier.

    J'ai trouvé la raison du souci dans cet article :

    http://blogs.charteris.com/blogs/pat...al-Parent.aspx

    En gros dans mon bouton parent j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <Button x:Name="btnEmployee"                                 
    CommandParameter="{Binding ElementName=cbxDepartments, Path=SelectedValue}">
    Et dans le bouton de son ContextMenu j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <Button Content="Insérer" 
    ToolTip="{Binding Path=PlacementTarget.CommandParameter, RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}}">
    Voilà donc en gros ne pas oublier de préciser "PlacementTarget" quand on veut faire appel au parent dans le Path

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

Discussions similaires

  1. Binding exterieur à un DataTemplate avec ElementName
    Par sfxzeus dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 29/01/2013, 10h01
  2. Binding de Button.Content dans un DataTemplate
    Par Invité dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 22/06/2011, 18h12
  3. concaténation avec string dans un champ bindé
    Par gentel_man dans le forum ASP.NET
    Réponses: 3
    Dernier message: 11/05/2010, 16h01
  4. Réponses: 1
    Dernier message: 05/05/2010, 16h28
  5. Binding d'un DataObject dans un DataTemplate
    Par rockeye dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 18/05/2009, 11h18

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