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] Comment le faire fonctionner TwoWay sur une Collection<String> ?


Sujet :

Windows Presentation Foundation

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 220
    Points
    220
    Par défaut [Binding] Comment le faire fonctionner TwoWay sur une Collection<String> ?
    J'essaie de faire un binding TwoWay sur une collection de string ObservableCollection<string>. La collection est affichée correctement, mais je n'arrive pas à mettre à jour les éléments de la collection.
    Et j'ai le même problème avec une collection de "int" et surement avec toutes les collections de type de base.

    Voici le code C#

    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
     
    public partial class ListViewTest : Window
        {
            ObservableCollection<string> _GameCollection = new ObservableCollection<string>();
     
            public ListViewTest()
            {
                _GameCollection.Add("World Of Warcraft");
                _GameCollection.Add("Halo");
                _GameCollection.Add("Gears Of War");
     
                InitializeComponent();
            }
     
            public ObservableCollection<string> GameCollection
            {
                get
                {
                    return _GameCollection;
                }
                set
                {
                    _GameCollection = value;
                }
            }
     
            private void AddRow_Click(object sender, RoutedEventArgs e)
            {
                _GameCollection.Add("A New Game");
            }
        }
    et 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
     
    <Window x:Class="ListViewTest.Test2.ListViewTest"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
        Title="Some Game Data" Height="216" Width="435">
      <StackPanel>
         <TextBox Text="{Binding Titre,Mode=TwoWay}"/>
         <ListView ItemsSource="{Binding GameCollection}">
          <ListView.View>
                    <GridView>
                        <GridViewColumn Width="140" Header="Game Name"  >
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBox Text="{Binding .,Mode=TwoWay}"/>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
     
            </GridView>
          </ListView.View>
        </ListView>
        <Button HorizontalAlignment="Right" Margin="5,5,5,5" Content="Add Row" Click="AddRow_Click" />
        </StackPanel>
    </Window>
    Est ce que j'ai fait une erreur dans le binding ou y a t-il une explication logique de ce mode de fonctionnement.

    ça fonctionne si je crée un classe wrapper du style

    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
     
    public class StringWrapper
    {
       public StringWrapper() : this(String.Empty)
       {
       }
       public StringWrapper(string s)
       {
          String = s;
       }
       public string StringWrapper
       {
          get { return String ; }
          set { String = value; }
       }
       string m_String ;
    }
    Avez-vous une idée ?

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 214
    Points : 341
    Points
    341
    Par défaut
    Je viens de tester ton exemple et il fonctionne très bien chez moi.
    Lorsque je clique sur "Add Row" j'ai bien un nouvel item qui apparaît dans le ListView...

    Peut être que j'ai mal compris ton soucis...
    www.japf.fr mon blog sur WPF et .Net

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 220
    Points
    220
    Par défaut
    Le problème n'est pas l'ajout d'un élément à la collection, mais la modification d'un élément.
    Si je modifie un élément dans l'interface il n'est pas modifié dans la collection _GameCollection

  4. #4
    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 matdur Voir le message
    Le problème n'est pas l'ajout d'un élément à la collection, mais la modification d'un élément.
    Si je modifie un élément dans l'interface il n'est pas modifié dans la collection _GameCollection
    Tu veux dire que si tu modifies un élément au niveau de ton IHM, la collection en mémoire n'est pas mise à jour ? Tu as essayé de mettre le binding en mode TwoWay ?

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 220
    Points
    220
    Par défaut
    Tu veux dire que si tu modifies un élément au niveau de ton IHM, la collection en mémoire n'est pas mise à jour ?
    Oui c'est bien ça le problème

    Tu as essayé de mettre le binding en mode TwoWay ?
    Oui, mais il n'y a rien à faire ça ne marche pas
    Pour la ListView.ItemsSource
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <ListView ItemsSource="{Binding GameCollection,Mode=TwoWay}">
    Pour TextBox.Tex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBox Text="{Binding .,Mode=TwoWay}"/>

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 214
    Points : 341
    Points
    341
    Par défaut
    Hmm ok.

    Je pense que pour que ça fonctionne, il faut que l'objet en question expose sa propriété au moyen d'accesseurs get/set. Le mécanisme de binding utilisant la réflection, peut être que ce n'est pas possible sans ça (donc ça expliquerait pourquoi ça fonctionne avec ta classe "stringwrapper").
    www.japf.fr mon blog sur WPF et .Net

  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
    On dirait aussi qu'il s'agit du problème récurant de l'interface INotifyPropertyChanged qui n'est pas implémentée. Mais sur la classe String, c'est normal donc à mon de passer par ta propre classe "wrapper", je ne vois pas...

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 220
    Points
    220
    Par défaut
    Merçi à tous pour vos réponses, donc c'est bien ce que je pensais ça ne marche pas, c'est dommage.
    Faute de mieux je passe par une ObservableCollection< CBindingWrapper<string>>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class CBindingWrapper<T>
    	{
    		public CBindingWrapper(T o_value)
    		{
    			Value = o_value;
    		}
     
    		public T Value
    		{
    			get;
    			set;
    		}

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2002
    Messages : 177
    Points : 81
    Points
    81
    Par défaut
    Je suis dans le même problème de rafraîchissement, pourrais-tu expliquer le code de ton dernier post ?

    Merci

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

Discussions similaires

  1. faire un if sur une collection
    Par lovedesitaliens dans le forum C#
    Réponses: 5
    Dernier message: 16/07/2010, 11h35
  2. Comment faire un rollover sur une image
    Par mackean dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 29/03/2007, 16h15
  3. Réponses: 23
    Dernier message: 08/06/2006, 15h06
  4. Comment faire un explode sur une chaine comme suit ?
    Par sebnutt dans le forum Langage
    Réponses: 3
    Dernier message: 07/06/2006, 11h59
  5. comment faire un DROP sur une NESTED TABLE
    Par gilux dans le forum Oracle
    Réponses: 1
    Dernier message: 14/03/2006, 18h07

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