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

C# Discussion :

Mis à jour d'une observablecollection


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 50
    Par défaut Mis à jour d'une observablecollection
    Bonjour,

    Je viens poster un problème ici car on m'a souvent apporter solutions .
    J'ai une observablecollection qui est bindée sur une listview. Jusque là aucun problème mes données s'affichent. Je peux modifier la valeur de mes données à la volée, ça marche aussi.
    En bas de ma fenêtre j'ai deux boutons, un Cancel et un Save. Mon problème c'est que quand je fais des modifications de données, même si j'appuie sur le bouton Cancel, elles sont enregistrées... J'ai essayé de créer une autre observablecollection, de la remplir avec un foreach sur la première mais rien à faire à chaque fois les données sont sauvées (probablement à cause du binding). J'ai essayé de changer ma collection en List mais là les données ne s'affichent plus dans la listview

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Une façon de faire serait que les items sauvent leur ancien état et ajouter une méthode Cancel qui recopierait l'ancien état.

    Exemple :
    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
     
    public in ID
    { 
     get { return _id;}
     set { 
        _oldid = _id;
        _id = value;
        ...
      }
     
    public void Cancel()
    {
       _id = _oldid;
       ....
    }

    C'est assez basique, mais si ça marche...

    Ou alors (ça ne marche pas avec toutes les frameworks XAML) : http://www.dutton.me.uk/2010/10/11/o...inding-in-wpf/

  3. #3
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour Phoenix07

    Ton class data peut implementer l'interface IEditableObject,en plus de l'interface INotifyPropertyChanged...
    Ton class ViewModel aussi peut egalement l'implementer...
    Les ItemsControl ont leur propriete ItemsSource lie en interne à une ListCollectionView (sortable ,filtrable etc...) et ListCollectionView wrappe les des methodes d'edition et de comitting (validation) de ton observablecollection sous-jacente (en xaml):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      ListCollectionView view = (ListCollectionView)this.myListBox.ItemsSource;
                view.CommitEdit()
                view.CommitNew()
                view.CancelEdit()
                view.CancelNew()
    De plus tu peux l'implementer -per data- c.à.d dans ton class Data ce qui permet d'avoir les memes methodes element par element accessibles ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
       ListCollectionView view = (ListCollectionView)this.lb1.ItemsSource;
     
    //element existant(modif)
      view.EditItem(object item);
      view.CancelEdit()
      view.CommitEdit();
     
     //nouvel element(ajout)
      view.AddNew();
      view.CancelNew();
      view.CommitNew();
    Cur ce lien le blog du sacre Dr Wpf de Microsoft (identite inconue à ce jour)tu trouveras un exemple d'implementation IEditableObject sur un class data Character tres intsructif et accessible avec code source...
    http://www.google.fr/url?q=http://drwpf.com/blog/2008/10/20/itemscontrol-e-is-for-editable-collection/&sa=U&ei=a7WJUeynEIbdHhgcgH&ved=0CCUQFjACOAo&usg=AFQjCNE3LXUWYceGQx_GxKLWVhfZpK2S1g
    bon code..........

  4. #4
    Rédacteur
    Avatar de benji_dv
    Homme Profil pro
    Architecte
    Inscrit en
    Juillet 2005
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 375
    Par défaut
    Bonjour,

    Si je comprends bien, l'action d'annulation porte sur les entités contenues dans l'observablecollection.
    L'annulation est, selon mois, un comportement de valeur et non du composant graphique.
    De plus, litemssource de ta listview est alimentée par les événements de la collection, mais les templates affiches pour les items portent sur litem lui même.

    Des lors, çe sont les items qui doivent implémenter l'annulation. La commande ICmmand exécutée par le bouton dans le view model appel la méthode cancel de chaque item concerne. Le binding en mode twoway mettra à jour lihm.

    Si tu ne t'en sors pas, je te ponds un exemple de code.
    Benjamin DEVUYST
    Et comme l'a dit Rick Osborne
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live"
    http://bdevuyst.developpez.com
    http://blog.developpez.com/bdevuyst
    www.bdevuyst.com

  5. #5
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour benji_dv

    L'annulation est, selon mois, un comportement de valeur et non du composant graphique.
    Le comportement de valeur portent aussi bien sur un item (je change la valeur d'un item par exemple) que sur la modification de la collection elle-meme(addition ou suppression d'element)...

    Les 2 sont lies .
    C'est le role du ListViewCollection qui ,s'il est utilise , de s'interposer en intermediaire dans le binding pour gerer le comportement de valeur et la retroaction visuelle (methode Refresh)....

    Evidement cela suppose que la liaison à l'observationcollection se fait via un CollectionViewSource et non directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <CollectionViewSource x:Key="CharacterCollectionView"
            Source="{Binding Source={StaticResource Characters}}">
     </CollectionViewSource>
     
    <ListBox Name="lb" 
             ItemsSource="{Binding Source={StaticResource CharacterCollectionView}}"
     </ListBox>
    bon code..........

  6. #6
    Rédacteur
    Avatar de benji_dv
    Homme Profil pro
    Architecte
    Inscrit en
    Juillet 2005
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 375
    Par défaut
    Si l'on parle d'ajout et de suppression, oui c'est également une solution.
    Je ne considérais pas que les opération d'ajout et de suppression étaient à prendre en compte dans la demande.
    Benjamin DEVUYST
    Et comme l'a dit Rick Osborne
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live"
    http://bdevuyst.developpez.com
    http://blog.developpez.com/bdevuyst
    www.bdevuyst.com

Discussions similaires

  1. [AJAX] mis à jours d'une adresse
    Par Eva01 dans le forum AJAX
    Réponses: 1
    Dernier message: 13/05/2009, 17h56
  2. Controles bindés ne se remettent pas à jour si data mis à jour dans une activité
    Par Harry_polin dans le forum Windows Workflow Foundation
    Réponses: 3
    Dernier message: 13/11/2008, 10h19
  3. objet "this" mis à jour par une méthode sans raison
    Par Macomoul dans le forum Langage
    Réponses: 8
    Dernier message: 03/02/2008, 17h11
  4. mis à jour d'une table impossible
    Par artotal dans le forum Requêtes
    Réponses: 8
    Dernier message: 31/01/2008, 09h26
  5. pboblème de mis à jour dans une table
    Par koff10 dans le forum Bases de données
    Réponses: 4
    Dernier message: 31/07/2005, 01h17

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