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 :

Datagrid : List vs Collection


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 29
    Par défaut Datagrid : List vs Collection
    Bonjour,

    J'utilise une Datagrid (WPF4) que je bind avec une List<T>. Dans ce cas tout fonctionne bien.

    En revanche si je bind avec une Collection<T> tel que recommandé par "Code Analysis" dans ce cas lorsque j'appuie sur la touche "Delete" pour effacer la ligne sélectionné cela ne fonctionne plus.

    Ce comportement est-il normal ? si oui pourquoi ?

    Merci pour votre aide.

  2. #2
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut
    Bonjour, il ne faut pas plutôt binder sur une ObservableCollection ?

    Par ailleurs il existe aussi les BindingList, si tu t'interesse au binding.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    On peut binder sur toute forme de Collection obito... tout dépend des besoins en réalité.

    Déjà c'est assez surprenant que cela fonctionne sur une List<> en règle générale, mais sur une Collection c'est normal. En effet, Collection est un modèle générique, mais il est préférable d'opter pour une implantation particulière de Collection qui plus est fortement typée.

    L'intérêt de faire un binding sur une ObservableCollection<T> (System.Collections.ObjectModel) c'est que c'est une collection qui implémente l'interface INotifyPropertyChanged, et sur laquelle on peut réclamer une vue par défaut.

    En fait dès lors que l'on demande la vue par défaut sur une instance de ObservableCollection, on obtient la même vue que celle utilisée par WPF, en effet, WPF ne bind pas directement l'ObservableCollection, mais une vue sur celle-ci, ICollectionView.
    L'intérêt est que sur l'ObservableCollection on va pouvoir récupérer tout changement d'état de celle-ci à la fois du coté de la logique, et également du coté de wpf, si des ajouts ou retrait sont fait coté logique.
    Mais sur la vue on va pouvoir également déterminé l'élément sélectionné (si on est en mode 1 seul... en effet, s'il y en a plusieurs seul le premier est indiqué, il faut donc procéder autrement) et également appliquer des filtres pour ne sélectionner que les éléments à afficher correspondant aux critères voulus.
    Là par contre le filtrage n'a plus rien avoir avec les DataView fortement utilisés sous Winforms, puisqu'on va devoir définir un prédicat qui pour chaque élément de la vue retournera la condition de vue ou non, ceci permet d'écrire des filtrages extrêmement puissants sans toucher à la collection.

    Ce fonctionnement est idéale pour recourir au pattern MVVM.
    Je te conseillerais donc d'oublier Collection et de passer à ObservableCollection<T> pour ta collection à binder à ton DataGrid.

    Généralement on utilise un binding sur une List ou une Collection ou un T[] seulement quand on souhaite avoir un affichage sans modification particulière, ni interaction utilisateurs quelconque sur les contrôles d'affichages.
    Dès lors que les besoins sont plus évolués en terme d'interactivité, donc typiquement une DataGrid, il est préférable d'avoir recours à des systèmes plus évolués comme des vraies BindingList donc ObservableCollection<T> par exemple.

  4. #4
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut
    Merci pour les précisions, du coup, je pense à implenter un ObservableCollection et une ICollectionView plutôt que mon DataView (pour mon problème sur la copie du DataView), j'avais l'habitude de faire ça en WinForm mais la on est en dans un mode de fonctionnement complètement différent, il va falloir que je m'y fasse.

    Après je savais qu'on pouvait binder sur toute formes de collection, mais le principal interêt est de pouvoir manipuler les données affichées et avec de simple List/Collection ca ne me paraissait pas trop possible.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    obito effectivement ce n'est pas possible car ces 2 collections n'ont pas de mécanismes de backtracking et ne peuvent pas te renseigner sur un changement éventuel d'état.

    en même temps ce n'est clairement pas leur but, et donc leur utilisation première

    effectivement utiliser des DataView en WPF ca fait un peu bizarre surtout lorsqu'on connait les possibilités en terme de binding de WPF comparées à celles des winforms qui étaient déjà pas mal en leur temps
    Disons que là, on est carrément dans une autre sphère, pour peu que tout ce qui est nécessaire implante les bons interfaces.

    Il est important que les données manipulées par tes collections implémentent elles même INotifyPropertyChanged, si tu veux profiter au maximum du binding.
    C'est le cas des entités générées par Entity Framework qui implantes toutes le INotifyPropertyChanged ou un équivalent (par le biais des héritages)

    Lorsque les collections, et les entités implantent toutes ces interfaces, on peut faire un binding dans les 2 sens (TwoWay) sinon on est contraint d'envisager un binding plus passif, sans spécifier le type de liaison, ou seulement dans un sens donc OneWay ou OneWayToSource.

  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
    L'intérêt de faire un binding sur une ObservableCollection<T> (System.Collections.ObjectModel) c'est que c'est une collection qui implémente l'interface INotifyPropertyChanged, et sur laquelle on peut réclamer une vue par défaut.
    Petite précision : c'est l'interface INotifyCollectionChanged qui spécifie la notification en cas de modification du contenu de la collection, comportement le plus souvent utilisé.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/10/2010, 12h07
  2. List (ou Collection) en entree d'un service web
    Par Nexussmb dans le forum Services Web
    Réponses: 7
    Dernier message: 07/08/2009, 14h54
  3. Listes Et Collections..
    Par nicolav dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/07/2009, 20h05
  4. ordonner un datagrid list au niveau du .net
    Par siimpatiico dans le forum ASP.NET
    Réponses: 2
    Dernier message: 30/06/2008, 16h54
  5. Réponses: 1
    Dernier message: 03/10/2005, 14h46

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