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 :

ComboBox dont seul l'élément sélectionné est éditable


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 ComboBox dont seul l'élément sélectionné est éditable
    Bonjour,

    j'essaye d'obtenir le composant suivant :
    une présentation des items en liste comme une ComboBox, dont chaque item serait éditable seulement quand il est l'item courant.
    Au pire les items pourraient être tout le temps éditables.

    Pour l'exemple supposons que les items à afficher soient des Database définies ainsi :
    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
    using System.ComponentModel;
     
    namespace TestWpfComboBox
    {
        public class Database : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
     
            protected void NotifyPropertyChanged(string info)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(info));
                }
            }
     
            private string _Name;
            public string Name
            {
                get
                {
                    return this._Name;
                }
                set
                {
                    this._Name = value;
                    this.NotifyPropertyChanged("Name");
                }
            }
        }
    }
    J'ai donc d'abord tenté de faire une simple ComboBox éditable en mettant la propriété IsEditable à True, mais alors comment exposer la propriété Name des items afin de la modifier via la ComboBox ?

    S'il n'est pas possible de procéder aussi simplement il est toujours possible de passer par l'ItemTemplate en utilisant une TextBox.
    Mais le premier problème est de faire en sorte que la TextBox occupe tout l'espace.
    Une première tentative non satisfaisante est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <ComboBox ItemsSource="{Binding ElementName=Self,Path=Databases,UpdateSourceTrigger=PropertyChanged}">
    	<ComboBox.ItemTemplate>
    		<DataTemplate>
    			<TextBox Text="{Binding Path=Name}" Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ComboBox},Path=ActualWidth}" />
    		</DataTemplate>
    	</ComboBox.ItemTemplate>
    </ComboBox>
    En effet la TextBox n'occupe pas exactement l'espace et pire quand l'item est sélectionné elle occupe toute la largeur de l'écran !
    Comment faire pour qu'elle s'adapte exactement ?

    Mais ça c'est plutôt un détail, le vrai problème est que quand un item est sélectionné il n'est plus possible d'en éditer la TextBox.
    Ce qui est une restriction du comportement "édition tout le temps" et le contraire du comportement idéal souhaité : "édition seulement quand sélectionné".


    Donc : avez vous des pistes pour obtenir le comportement idéal "édition seulement quand sélectionné", sinon pour obtenir le comportement "édition tout le temps" ?
    Malheureusement il ne semble pas exister de "SelectedItemTemplate" ou de "EditTemplate" qui auraient sans doute pu simplifier la tâche.


    Merci d'avance.

    PS : En pièce jointe se trouve un projet minimal illustrant les problèmes.
    Fichiers attachés Fichiers attachés

  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
    Salut,

    Citation Envoyé par seriousme
    En effet la TextBox n'occupe pas exactement l'espace et pire quand l'item est sélectionné elle occupe toute la largeur de l'écran !
    Comment faire pour qu'elle s'adapte exactement ?
    Si tu fixe la largeur de ta comboBox, c'est bon


    Après, je n'a pas bien compris ce que tu veux... Tu veux pouvoir entrer une valeur qui n'est pas dans la ComboBox, c'est ça ?

  3. #3
    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
    Sinon t'as peut-être un truc comme ça :

    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
    21
    22
    23
      <Grid>
        <Grid.ColumnDefinitions>
          <ColumnDefinition />
          <ColumnDefinition Width="18" MaxWidth="18" />
        </Grid.ColumnDefinitions>
     
        <ComboBox x:Name="Combo1" x:FieldModifier="private" 
                  Grid.Column="0" Grid.ColumnSpan="2" Background="Transparent" 
                  IsTabStop="False" 
                  ItemsSource="{Binding ElementName=Self,Path=Databases,UpdateSourceTrigger=PropertyChanged}" 
                  Text="{Binding Name}" 
                  Margin="0,2,0,0" VerticalAlignment="Center" >
          <ComboBox.ItemTemplate>
            <DataTemplate>
              <TextBlock Text="{Binding Path=Name}" />
            </DataTemplate>
          </ComboBox.ItemTemplate>
        </ComboBox>
        <TextBox Grid.Column="0"
                 Text="{Binding ElementName=Combo1, Path=SelectedValue.Name}"
                 Margin="1,2,0,0" VerticalAlignment="Center" 
                 />
      </Grid>

    A défaut d'avoir vu comment faire avec le IsEditable, tu peux utiliser un textbox que tu places par dessus (cf l'exemple)

  4. #4
    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
    Citation Envoyé par seriousme Voir le message
    En effet la TextBox n'occupe pas exactement l'espace et pire quand l'item est sélectionné elle occupe toute la largeur de l'écran !
    HorizontalAlignment à Stretch ?

  5. #5
    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
    ya pas horizontalcontentaligment la dessus ?

  6. #6
    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
    Merci de vos réponses.

    Sinon t'as peut-être un truc comme ça :
    ...
    A défaut d'avoir vu comment faire avec le IsEditable, tu peux utiliser un textbox que tu places par dessus (cf l'exemple)
    C'est un peu un "hack" mais ça marche nickel; le seul détail gênant est le "18" en dur.

    HorizontalAlignment à Stretch ?
    Sur la TextBox ? Non ça ne change rien à son rendu.

    ya pas horizontalcontentaligment la dessus ?
    En effet sur la ComboBox ça donne l'effet voulu.
    Sauf que ... il y a un peu de marge de part et d'autre des TextBox.

    En tout cas ça fait pas mal de pistes, merci beaucoup.

  7. #7
    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
    ca pour les marge tu joue avec les margin sur tes textbox ca devrais aller

  8. #8
    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
    Citation Envoyé par seriousme Voir le message
    Merci de vos réponses.


    C'est un peu un "hack" mais ça marche nickel; le seul détail gênant est le "18" en dur.
    Si tu te fais un Templated Control, tu pourras paramétrer cette valeur normalement.

Discussions similaires

  1. Réponses: 33
    Dernier message: 12/01/2011, 16h20
  2. Réponses: 10
    Dernier message: 17/08/2010, 20h59
  3. [AC-2003] Fermer une application dont seul une partie du titre est connu
    Par Miss Ti dans le forum VBA Access
    Réponses: 1
    Dernier message: 10/06/2009, 23h53
  4. Binder l'élément sélectionné d'un combobox
    Par jean-pierre96 dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 31/03/2009, 12h34
  5. Réponses: 10
    Dernier message: 12/09/2007, 16h25

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