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 de GridViewColumn width n'est pas mon ami !


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    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
    Par défaut binding de GridViewColumn width n'est pas mon ami !
    re-bonjour

    c'est encore moi

    voici donc un petit source sympa

    pour le xaml
    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
     
    <Window x:Class="SentinelSAS.Window3"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:Local="clr-namespace:SentinelSAS"
        Title="TestLogger" Height="488" Width="760">
        <Window.Resources>
            <Local:TestCollection x:Name="Tests" x:Key="Tests" />
     
            <Style TargetType="{x:Type ListViewItem}" x:Key="myListViewItemStyle">
                <Setter Property="Height" Value ="100"/>
            </Style>
     
        </Window.Resources>
     
        <Grid>
            <ListView ItemsSource="{Binding Source={StaticResource Tests}}"
                      x:Name="listView1"
                      ItemContainerStyle="{StaticResource myListViewItemStyle}"
                      >
                <ListView.View>
                    <GridView AllowsColumnReorder="True">
                        <GridViewColumn 
                            Width="{Binding 
                                RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, 
                                Path=ActualHeight}"
                            >
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <Ellipse x:Name="el"
                                        Width="{Binding RelativeSource={RelativeSource FindAncestor,
                                            AncestorType={x:Type ListViewItem}}, Path=ActualHeight}"
                                        Height="{Binding ElementName=el, Path=Width}" 
                                        Stroke="Black">
                                    </Ellipse>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn Header="Nom" DisplayMemberBinding="{Binding Path=Nom}" Width="150"/>
                        <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Path=Age}" Width="150"/>
                    </GridView>
                </ListView.View>
            </ListView>
        </Grid>
    </Window>
    et celui ci pour la fenetre
    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
    53
    54
    55
    56
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Shapes;
    using System.Collections.ObjectModel;
     
    namespace SentinelSAS
    {
        /// <summary>
        /// Logique d'interaction pour Window3.xaml
        /// </summary>
        public partial class Window3 : Window
        {
            public Window3()
            {
                InitializeComponent();
                TestCollection pc = this.Resources["Tests"] as TestCollection;
                pc.Add(new Test { Nom = "alpha 1", Age = 10 });
                pc.Add(new Test { Nom = "alpha 2", Age = 25 });
                pc.Add(new Test { Nom = "alpha 3", Age = 50 });
                pc.Add(new Test { Nom = "alpha 4", Age = 15 });
                pc.Add(new Test { Nom = "alpha 5", Age = 22 });
                pc.Add(new Test { Nom = "alpha 6", Age = 65 });
                pc.Add(new Test { Nom = "alpha 7", Age = 65 });
                this.listView1.DataContext = pc;
            }
        }
     
        public class Test
        {
            private string _Nom = "";
            public string Nom
            {
                get { return _Nom; }
                set { _Nom = value; }
            }
            private int _Age = 0;
            public int Age
            {
                get { return _Age; }
                set { _Age = value; }
            }
        }
        public class TestCollection : ObservableCollection<Test>
        {
        }
    }
    voici donc mon nouveau probleme :
    j'aimerais binder le width de mon GridViewColumn
    soit sur le height de mon style

    <Style TargetType="{x:Type ListViewItem}" x:Key="myListViewItemStyle">
    <Setter Property="Height" Value ="100"/>
    </Style>

    defini dans les resources

    soit sur le ActualHeight des ListViewItem c'est d'ailleurs ce que j'ai ecrit

    Width="{BindingRelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}},Path=ActualHeight}"

    mais semble t'il cela ne fonctionne pas vraiment ...
    c'est etonnant d'ailleurs puisque qu'en bindant l'ellipse (width, height) sur ce meme listviewitem cela fonctionne

    kekun a une tite idee ?

  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
    Et en essayant ca ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Width="{BindingRelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}},Path=Height}"

  3. #3
    Membre Expert
    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
    Par défaut
    j'avais deja essayé mais j'ai rententé et ....
    ca ne fonctionnne pas

  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
    Citation Envoyé par ikeas
    c'est etonnant d'ailleurs puisque qu'en bindant l'ellipse (width, height) sur ce meme listviewitem cela fonctionne

    kekun a une tite idee ?
    Oui en fait l'ellipse a bien un parent ListViewItem, mais pas la GridViewColumn

    Par contre le GridViewColumn a comme parent le ListView qui a la propriété Items ou ItemsContainerStyle, et d'autres.
    Peut-être que tu peux t'en sortir avec ça

  5. #5
    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 quand même voulu tester (pour ne pas dire de bêtise) et c'est bien ça

    Donc pour le GridViewColumn :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}, 
                    Path=ItemContainerStyle, Converter={StaticResource WidthConv} }" />

    Et dans le converter, il est possible de récupérer la hauteur ainsi :
    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
      /// <summary>
      /// Converter.
      /// Permet de déterminer la largeur de la colonne.
      /// </summary>
      public class WidthPlus15Converter : IValueConverter {
        public object Convert( object o, Type type, object parameter,
                              CultureInfo culture ) {
          return (double)( ( from i in ( (Style)o ).Setters.ToList()
                             where ( (Setter)i ).Property == ListViewItem.HeightProperty
                             select ( (Setter)i ) ).Single().Value ) + 15.0;
        }
     
        public object ConvertBack( object o, Type type, object parameter,
                                  CultureInfo culture ) {
          throw new NotSupportedException();
        }
      }

  6. #6
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    return (double)( ( from i in ( (Style)o ).Setters.ToList()
                             where ( (Setter)i ).Property == ListViewItem.HeightProperty
                             select ( (Setter)i ) ).Single().Value ) + 15.0;
    Oula, ca pique les yeux ca comme code

  7. #7
    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
    Oh si peu

    Du Linq, une ou deux petites conversions par ci par là, une belle recette quoi

  8. #8
    Membre Expert
    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
    Par défaut
    merci allez louya
    ca marche

    ps : en effet ca pique un peu les yeux ce magnifique code linq

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

Discussions similaires

  1. can't yp-bind: Reason: le domaine n'est pas délimité
    Par carenamina dans le forum RedHat / CentOS / Fedora
    Réponses: 1
    Dernier message: 16/11/2011, 23h32
  2. Mon code n'est pas interprété !
    Par korriganez dans le forum Langage
    Réponses: 3
    Dernier message: 31/05/2006, 15h46
  3. Réponses: 2
    Dernier message: 19/10/2005, 19h39
  4. Mon script cron n'est pas pris en compte
    Par tomnie dans le forum Linux
    Réponses: 11
    Dernier message: 31/03/2004, 11h19

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