2009-06-29 11 views
1

Je me bats depuis un certain temps maintenant avec lier mon ListView à une table. J'ai lu diverses solutions, mais j'ai toujours des problèmes. J'ai 2 tables de base de données: Customer s et Product s. Pour chaque Customer il y a une liste de Product s.Linq-to-SQL: liaison ListView

Dans ma première tentative, je me lie au code Linq-to-SQL généré. Cela signifie que je lie immédiatement à Customer.Products. Mais comme il s'agit du type System.Data.Linq.EntitySet<Product>, je ne reçois pas de notification lorsque des éléments sont ajoutés/supprimés de la base de données.

J'étendu le code généré en ajoutant une méthode pour Customer qui enveloppe le retour System.Data.Linq.EntitySet<Product> dans un ObservableCollection (comme par divers blogs conseillé)

public ObservableCollection<Product> ObservableProducts 
{ 
    get 
    { 
     return new ObservableCollection<Product>(Products); 
    } 
} 

Mais maintenant, je ne peux rien ajouter à la collection. Quand j'appelle ObservableProducts.Add() rien est ajouté ..

Répondre

2

Un ObservableCollection est pas une vue sur une collection sous-jacente - il est une collection dans son propre droit. Lorsque vous transmettez le List au ObservableCollection, les éléments du List sont copiés dans le ObservableCollection.

Donc, votre article est ajouté, mais seulement dans la ObservableCollection - pas le List sous-jacente vous a été transmis.

Options pour aller de l'avant comprennent:

  • L'utilisation d'un ObservableCollection dans votre couche de données. Convertir la liste des entités à un ObservableCollection tout de suite et l'utiliser dans toute l'application.
  • Écoute des modifications apportées au ObservableCollection et application de ces modifications au sous-jacent List.
  • Ecrivez une implémentation de INotifyCollectionChanged que est une vue sur une collection sous-jacente. Cela ne peut fonctionner que dans un sens (OC-> List mais pas List-> OC) et devient compliqué si vous avez une application multithread.
Questions connexes