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 :

ObservableCollection non actualisée sur modifs TextBox


Sujet :

Windows Presentation Foundation

  1. #1
    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 ObservableCollection non actualisée sur modifs TextBox
    Bonjour,

    j'ai un petit problème d'actualisation d'ObservableCollection.

    Pour mon projet, j'ai 2 fichiers XML bindés, dont 1, les données s'affichent dans une listView(pas de problème d'actualisation de la collection) et l'autre fichier XML bindé, s'affiche dans des champs TextBox.

    Malheureusement lors de modification des TextBox, je n'arrive pas à sérializer les changements, car l'ObservableCollection ne tient pas compte des changements.

    Ce qui me déboussole un peu, c'est que pour la collection liée à la listView, j'ai pratiquement le même code et pourtant dès que je modifie un champ, la modification est bien reportée dans l'observableCollection...

    J'ai testé : INotifyPropertyChanged mais sans résultat.

    Voici les points principaux de mon projet :

    XAML:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    <c:ConfigCollection x:Key="Config"/>
    <TextBox Name="tbOffset" Text='{Binding Source={StaticResource Config}, Path=Offset}' />
    Classe ObservableCollection

    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
     public class Config : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
    
            public SetupFtpSsh SetupFtpSsh;
               
            public Config()
            {
    
            }
            
            private void OnPropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
    
            //Deserialize a XML file and send it in a collection
            public ConfigCollection LoadConfig(ConfigCollection pConfigCollection, string pFilePath)
            {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(ConfigCollection));
                using (StreamReader streamReader = new StreamReader(pFilePath))
                {
                    pConfigCollection = xmlSerializer.Deserialize(streamReader) as ConfigCollection;
                }
                return pConfigCollection;
            }
            //Serialize a XML file from a collection
            public void SaveConfig(ConfigCollection pConfigCollection, string pFilePath)
            {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(ConfigCollection));
                using (StreamWriter streamWriter = new StreamWriter(pFilePath))
                {
                    xmlSerializer.Serialize(streamWriter, pConfigCollection);
                }
            }
    
        }
    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
    public class SetupFtpSsh
           {
               public event PropertyChangedEventHandler PropertyChanged;
     
               private string offset;
     
     
               public SetupFtpSsh()
               {
     
               }
     
               private void OnPropertyChanged(string propertyName)
               {
                   if (this.PropertyChanged != null)
                       this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
               }
     
               public SetupFtpSsh(string offset)
               {
                   this.offset = offset;
               }
     
               public string Offset
               {
                   get { return offset; }
                   set { offset = value; }
               }

    Code behind

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            private Config config = new Config();
            private ConfigCollection configCollection = new ConfigCollection();
    
     public Window1()
            {
    configCollection = config.LoadConfig(configCollection, filePathConfig);//Le load marche parfaitement
    
    foreach (Config t_config in configCollection)
                 {
                // SetupFtpSsh Part
                    tbOffset.Text = t_config.SetupFtpSsh.Offset;
    }
    L'appel de la méthode Save où la collection ne se met pas à jour automatiquement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void buttonSaveConfiguration_Click(object sender, RoutedEventArgs e)
            {
                config.SaveConfig(configCollection, filePathConfig);
            }
    configCollection n'est jamais touché mis à part ces lignes ci-dessus.

    D'où pourrait provenir le problème ??

    J'ai pensé au binding qui est fait directement sur le TextBox(y'en a plusieurs dans mon programme bien sûr) à la place de faire le Binding sur un élément Group par exemple (StackPanel ou autres).

    Sinon, j'ai tenté d'approfondir avec INotifyPropertyChanged(enlevé, déplacé). et là aucun changement.

    Ce que je n'ai pas bien compris, pour ma listView, j'ai totalement enlevé les appels de INotifyPropertyChanged et pourtant, ma collection se mettait toujours à jour !!!!


    Un grand merci d'avance pour votre aide.

  2. #2
    Membre expérimenté
    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
    Points : 1 313
    Points
    1 313
    Par défaut
    deja pour que ca marche il faudrait mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public string Offset
               {
                   get { return offset; }
                   set 
    { 
    offset = value; 
    OnPropertyChanged("Offset")
     
    }
               }
    et faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class SetupFtpSsh : INotifyPropertyChanged
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  3. #3
    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
    tester mais ca ne change rien.

    Comment se fait-il, que même sans cela, j'arrive à "choper" les modifs de mon autre ObservableCollection bindé sur une ListView ???

    J'ai testé cette ObservableCollection sans INotifyPropertyChanged et pourtant les modifications sont bien gérées...

  4. #4
    Membre expérimenté
    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
    Points : 1 313
    Points
    1 313
    Par défaut
    en fait la observable collection implemente deja inotifipropertychanged et la notification pour les collections

    ce que j'arrive pas a comprendre dans ton code c'est comment tu distingue les deux (la collection et l'objet de la collection)

    je ne te cache pas que si tu avais un petit source de base fonctionel montrant ton probleme ca serais deja resolu eheheheheheh
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  5. #5
    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
    ok pour ObservableCollection.

    J'ai essayé de "résumer" mon projet et de ne mettre que le nécessaire.

    Alors je vais essayer de montrer des autres parts du code, si tu as besoin d'autres infos, n'hésite pas et encore merci d'avance

    le code XML de mon fichier config.xml donne quelquechose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <ConfigCycling xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Config>
        <SetupFtpSsh>
          <Offset>1</Offset>
        </SetupFtpSsh>
        <NavigationSetup>
    </NavigationSetup>
    </Config>
    </ConfigCycling>
    L'affichage XAML du Bindage qui ne se met pas à jour (ConfigCollection)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <Window.Resources>
            <c:ConfigCollection x:Key="Config"/>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBox Name="tbOffset" Text='{Binding Source={StaticResource Config}, Path=Offset}' />
    L'initialisation de mes TextBox dans mon code behind.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public Window1()
            {
                InitializeComponent();
                //Load information inside filePathConfig and put into configCollection
                configCollection = config.LoadConfig(configCollection, filePathConfig);
     
             //parse of the configCollection and place into Textboxes
                foreach (Config t_config in configCollection)
                {  tbOffset.Text = t_config.NavigationSetup.Offset;
    Le code ci-dessous est celui de mon autre ObservableCollection avec mon autre fichier XML et qui celui se met à jour parfaitement.

    fichier XML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <Cycling xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Track>
        <Order1>1</Order1>
        <Order2>Add</Order2>
        <Title>title</Title>
      </Track>
    </Cycling>
    La classe de l'ObservableCollection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [XmlRoot("Cycling")]
        public class TrackCollection : ObservableCollection<Track>
        {
            public TrackCollection()
                : base()
            {
     
            }
        }
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     public class Track : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
     
            private string order1;
            private string order2;
            private string title;
     
            public Track()
            {
     
            }
     
    public Track(string order1, string order2, string title)
            {
                this.order1 = order1;
                this.order2 = order2;
                this.title = title;
            }
     
    public string Order1
            {
                get { return order1; }
                set
                {
                    order1 = value;
                }
            }
     
            public string Order2
            {
                get { return order2; }
                set
                {
                    order2 = value;
                }
            }
     
            public string Title
            {
                get { return title; }
                set { title = value; }
            }
     
    rivate void OnPropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
     
            public void AddTrack(TrackCollection pTrackCollection)
            {
                int compteur = pTrackCollection.Count+1;
                Track track = new Track(Convert.ToString(compteur), "Add", "title");
     
                pTrackCollection.Add(track);
            }
     
    //Serialize a XML file from a collection
            public void SaveTrack(TrackCollection pTrackCollection, string pFilePath)
            {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(TrackCollection));
                using (StreamWriter streamWriter = new StreamWriter(pFilePath))
                {
                    xmlSerializer.Serialize(streamWriter, pTrackCollection);
                }
            }
     
            //Deserialize a XML file and send it in a collection
            public TrackCollection LoadTrack(TrackCollection pTrackCollection,string pFilePath)
            {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(TrackCollection));
                using (StreamReader streamReader = new StreamReader(pFilePath))
                {
                    pTrackCollection = xmlSerializer.Deserialize(streamReader) as TrackCollection;
                }
                return pTrackCollection;
            }
    La fenêtre du code behind :

    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
    public partial class Window1 : Window
        {
    //Declaration of track and trackCollection
            private Track track = new Track();
            private TrackCollection trackCollection = new TrackCollection();
     
    public Window1()
            {
                InitializeComponent();
     
     //Load information inside filePathData and put into trackCollection
                trackCollection = track.LoadTrack(trackCollection, filePathData);
                listView.ItemsSource = trackCollection;
     
    /*
             * Add of a Track
             */
            private void Add_Click(object sender, RoutedEventArgs e)
            {
                trackCollection = (TrackCollection)listView.ItemsSource;
                track.AddTrack(trackCollection);
            }
            /*
             * save the modification of the listView in the XML file
             */
            private void Save_Click(object sender, RoutedEventArgs e)
            {
               // TrackCollection trackCollection;
                //trackCollection = (TrackCollection)listView.ItemsSource;
     
                track.SaveTrack(trackCollection, filePathData);         
            }
    au niveau XAML, l'affichage se fait dans 1 listView comme ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <Window.Resources>
            <c:TrackCollection x:Key="TrackListData"/>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <ListView x:Name="listView" ItemsSource='{Binding Source={StaticResource TrackListData}}'>
    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
    <ListView.View>
                                        <GridView>
                                            <GridViewColumn Width="150" >
                                                <!--tag is useful to sort the listview by column-->
                                                <GridViewColumnHeader Content="Order1" Click="SortClick"  Tag="Order1"/>
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <Grid>
                                                            <TextBlock Style="{StaticResource GridBlockStyle}" Text="{Binding Path=Order1}" />
                                                            <TextBox Name="Order1" Style="{StaticResource GridEditStyle}" Text="{Binding Path=Order1, Mode=TwoWay}"/>
     
                                                        </Grid>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
    ce que je peux encore préciser, c'est qu'il y a "1 étage" de différence entre mon premier fichier XML et le second et que dans 1(celui qui marche), on affiche le résultat dans 1 ListView, et l'autre dans des textBox

  6. #6
    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 me rapproche du but!

    j'ai remarqué que lorsque l'on quittait le TextBox avec une modification des données l'on passait (pour la partie qui fonctionne) dans la méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     public string Order1
            {
                get { return order1; }
                set
                {  
                    order1 = value;
                    OnPropertyChanged("Order1");
                }
            }
    mais jamais dans (autreObservableCollection qui ne fonctionne pas)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public string Offset
            {
                get { return offset; }
                set 
                {
                    offset = value;
                    OnPropertyChanged("Offset");
                }
            }
    donc on set jamais la valeur et c'est pour ça que la Collection ne se met pas à jour. Maintenant reste à trouver pourquoi l'on passe 1x et pas l'autre sur l'événement perte de focus sur une textBox (que je n'ai jamais implémenté, c'est automatique)

  7. #7
    Membre expérimenté
    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
    Points : 1 313
    Points
    1 313
    Par défaut
    tu peux pas mettre en pj un petit projet ?
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  8. #8
    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
    voilà
    Fichiers attachés Fichiers attachés

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Salut,

    Le problème se trouve dans le constructeur Window1(). Après avoir charger ta collection configCollection tu fais un boucle sur les objets et tu assignes les valeurs aux propriétés Text des textbox

    Le binding déclaré dans Window1.xaml est alors perdu et les changements dans les textboxes ne sont pas passée aux objets.

    Supprime cette boucle et corrige tes binding dans le XAML.

  10. #10
    Membre expérimenté
    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
    Points : 1 313
    Points
    1 313
    Par défaut
    en fait il y a plus simple deja
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                //Load information inside fileData and put into trackCollection
                trackCollection = track.LoadTrack(trackCollection, fileData);
                TrackCollection tc = this.Resources["TrackListData"] as TrackCollection;
                tc.CopyFrom(trackCollection);
                //listView.ItemsSource = trackCollection;
    tu cree la focntion CopyFrom dans TrackCollection qui vas copier la collection trackcollection dans tc ....

    comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      public void CopyFrom(TrackCollection tc)
            {
                foreach (Track c in tc)
                    this.Add(c);
            }
    ca regle deja un probleme
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  11. #11
    Membre expérimenté
    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
    Points : 1 313
    Points
    1 313
    Par défaut
    a propos en regardant ton code tu pourrais utiliser une enum pour remplacer LibelleTypeCollection
    comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public enum LibelleTypeCollection
    {
    B,H,R,S,T
    }
    et dans le xaml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     <!-- eModeControlTCM VALUES -->
            <ObjectDataProvider x:Key="LibelleTypeCollection" MethodName="GetValues" ObjectType="{x:Type sys:Enum}" >
                <ObjectDataProvider.MethodParameters>
                    <x:Type TypeName="local:LibelleTypeCollection" />
                </ObjectDataProvider.MethodParameters>
            </ObjectDataProvider>
    et tu bind sur {StaticResource LibelleTypeCollection}"
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  12. #12
    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
    Premièrement, merci à vous d'avoir pris du temps pour examiner mon code.


    Citation Envoyé par Pikul Voir le message
    Salut,

    Le problème se trouve dans le constructeur Window1(). Après avoir charger ta collection configCollection tu fais un boucle sur les objets et tu assignes les valeurs aux propriétés Text des textbox

    Le binding déclaré dans Window1.xaml est alors perdu et les changements dans les textboxes ne sont pas passée aux objets.

    Supprime cette boucle et corrige tes binding dans le XAML.
    D'accord, mais si j'ai fait de cette manière, c'est que le Binding ne fonctionnait pas.

    Je ne sais pas si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBox Name="tbServerAddress" Text='{Binding Source={StaticResource Config}, Path=ServerAddress}' />
    est une bonne syntaxe ou si alors je dois "Binder" toutes les textbox à 1 seul endroit (StackPanel, etc...) où alors ma syntaxe ci-dessus est bonne et je dois adapter quelquechose...





    Edit: J'avais mal lu sorry...


    Citation Envoyé par ikeas Voir le message
    a propos en regardant ton code tu pourrais utiliser une enum pour remplacer LibelleTypeCollection
    comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public enum LibelleTypeCollection
    {
    B,H,R,S,T
    }
    et dans le xaml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     <!-- eModeControlTCM VALUES -->
            <ObjectDataProvider x:Key="LibelleTypeCollection" MethodName="GetValues" ObjectType="{x:Type sys:Enum}" >
                <ObjectDataProvider.MethodParameters>
                    <x:Type TypeName="local:LibelleTypeCollection" />
                </ObjectDataProvider.MethodParameters>
            </ObjectDataProvider>
    et tu bind sur {StaticResource LibelleTypeCollection}"
    Pourquoi utilisées une Enum ??? Quelle est la différence avec ObservableCollection ??

    J'ai une erreur quand je pose le code, car il ne trouve pas "sys", et je ne sais pas comment le déclarer exactement

    J'ai testé plusieurs manières dont celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:sys="clr-namespace:WpfInternetUploadManager"
    mais toujours une erreur.

  13. #13
    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
    Citation Envoyé par ikeas Voir le message
    en fait il y a plus simple deja

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      public void CopyFrom(TrackCollection tc)
            {
                foreach (Track c in tc)
                    this.Add(c);
            }
    ca regle deja un probleme
    Peux-tu juste m'expliquer ce que représente this ??

  14. #14
    Membre expérimenté
    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
    Points : 1 313
    Points
    1 313
    Par défaut
    une enum c'est une enumeration
    regarde ce que c'est en c#
    c'est plus simple a utiliser qu'une observalblecollection
    car tu peut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LibelleTypeCollection x = LibelleTypeCollection.B;
    pour le mot clef this regrade aussi la doc du c#
    ca represente dans la classe ou tu est l'objet courrant

    pour le sys c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  15. #15
    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
    Citation Envoyé par Pikul Voir le message
    Salut,

    Le problème se trouve dans le constructeur Window1(). Après avoir charger ta collection configCollection tu fais un boucle sur les objets et tu assignes les valeurs aux propriétés Text des textbox

    Le binding déclaré dans Window1.xaml est alors perdu et les changements dans les textboxes ne sont pas passée aux objets.

    Supprime cette boucle et corrige tes binding dans le XAML.
    J'ai creusé un peu et j'arrive à un point bizarre.

    Mes données doivent être normalement affichés dans des TextBox.

    Comme je n'arrivais à faire la liaision, je les ai mises dans 1 listView contenant des TextBox et là ca marche.

    Gardant ma listView (parce que ca marche!)et bindant mes autres TextBox(non compris dans la listView) tjs pour tester, le contenu de ces dernières TextBox ne s'affichent pas correctement alors que la ListView est ok.

    Le plus surprenant est que lorsque je clicke sur la listView(sélection d'1 row), mes données des TextBox à l'extérieur de la listView sont rafraîchis et tout est OK!!!!

    J'ai vu que c'était à cause que ma listView à la propriété
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IsSynchronizedWithCurrentItem="True"
    Que me faut-il faire pour que le bindage fonctionne sur les TextBox sans devoir cliquer sur une listView ou quoi que ce soit ???

    Voici ma listView bidon:

    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
    <ListView x:Name="listView2" Style="{StaticResource grid00}" ItemsSource='{Binding Source={StaticResource Config}}' IsSynchronizedWithCurrentItem="True" Background="AliceBlue" Grid.Column="2" Margin="1,-6,-11,6">
                                    <ListView.View>
                                        <GridView>
                                            <GridViewColumn Width="150" >
                                                <!--tag is useful to sort the listview by column-->
                                                <GridViewColumnHeader Content="Order1" />
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <Grid>
                                                            <TextBlock Text="{Binding Path=SetupFtpSsh.SiteConfig}" />
                                                            <TextBox Text="{Binding Path=SetupFtpSsh.SiteConfig, Mode=TwoWay}" />
     
                                                        </Grid>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
     
                                            <GridViewColumn Width="150" >
                                                <!--tag is useful to sort the listview by column-->
                                                <GridViewColumnHeader Content="Order1" />
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <Grid>
                                                            <TextBlock Style="{StaticResource GridBlockStyle}" Text="{Binding Path=Test}" />
                                                            <TextBox Style="{StaticResource GridEditStyle}" Text="{Binding Path=Test, Mode=TwoWay}" />
     
                                                        </Grid>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
                                        </GridView>
                                    </ListView.View>
                                </ListView>

    et le code de ma TextBox:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBox Style="{StaticResource grid00}" Height="23" Margin="141,51,270,0" Name="tbSiteConfiguration" VerticalAlignment="Top" Text='{Binding Source={StaticResource Config}, Path=SetupFtpSsh.SiteConfig, Mode=TwoWay}' />

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Hello,

    J'ai corrigé ton appli de la façon suivante:

    1. Supprime la collection Config que tu as déclaré dans les Window.Resources
    2. Supprime la boucle foreach sur configCollection dans le constructeur de Window1.
    3. Donne un nom à ton TabItem

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     <TabItem Header="Setup" x:Name="tabSetup">
    4. Assigne ta collection au DataContext de TabItem

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //Load information inside fileConfig and put into configCollection
    configCollection = config.LoadConfig(configCollection, fileConfig);
    tabSetup.DataContext = configCollection;
    5. Modifie tes Bindings...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <TextBox Text="{Binding Path=SetupFtpSsh.SiteConfig}" Style="{StaticResource grid00}" Height="23" Margin="141,51,270,0" Name="tbSiteConfiguration" VerticalAlignment="Top"  />
    <TextBox Text="{Binding Path=SetupFtpSsh.ServerAddress}" Style="{StaticResource grid00}" Margin="141,88,270,89" Name="tbServerAddress"  />
    <TextBox Text="{Binding Path=SetupFtpSsh.RemoteDirectory}" Style="{StaticResource grid00}" Height="23" Margin="141,0,192,50" Name="tbRemoteDirectory" VerticalAlignment="Bottom"  />
    <TextBox Text="{Binding Path=SetupFtpSsh.TransmissionTimeOut}"Style="{StaticResource grid00}" Height="23" Margin="141,0,270,16" Name="tbTransmissionTimeOut" VerticalAlignment="Bottom"  />
    <TextBox Text="{Binding Path=SetupFtpSsh.UserName}"Style="{StaticResource grid00}" Margin="0,48.947,20,128.053" Name="tbUsername" HorizontalAlignment="Right" Width="139"  />
    et voilà... ton problème vient du fait que tu bind tes textboxes à un objet vide (celui déclaré dans Window.Resource), en utilisant le DataContext tu évites bien des problèmes...

  17. #17
    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
    merci beaucoup! Ce point est OK!

  18. #18
    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
    Citation Envoyé par ikeas Voir le message
    une enum c'est une enumeration
    regarde ce que c'est en c#
    c'est plus simple a utiliser qu'une observalblecollection
    car tu peut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LibelleTypeCollection x = LibelleTypeCollection.B;
    pour le mot clef this regrade aussi la doc du c#
    ca represente dans la classe ou tu est l'objet courrant

    pour le sys c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    merci je vais regarder tout ca

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

Discussions similaires

  1. [XL-2010] Erreur de compilation : variable non définie sur un textbox
    Par Bricomachin dans le forum Excel
    Réponses: 4
    Dernier message: 12/04/2013, 11h56
  2. Réponses: 2
    Dernier message: 02/08/2010, 16h31
  3. Modifications non sauvegardées sur BD Access
    Par cedric/copy dans le forum ASP
    Réponses: 22
    Dernier message: 06/04/2009, 14h22
  4. Modifications non effectuées sur sortie de formulaire
    Par jojodid dans le forum VBA Access
    Réponses: 1
    Dernier message: 28/08/2008, 16h19
  5. CheckBox+Actualisation sur Textbox
    Par dahu17 dans le forum ASP.NET
    Réponses: 11
    Dernier message: 19/04/2007, 15h37

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