2010-05-10 5 views
1

J'ai deux tables dans le modèle, une table contient des entrées liées à l'autre table dans un à plusieurs relations, par exemple:Reliure DataGridComboBoxColumn à un à plusieurs relation entity framework

Table User 
    ID 
    Name 

Table Comments 
    ID 
    UserID 
    Title 
    Text 

Je veux affiche une grille de données dans une fenêtre WPF avec deux colonnes, une colonne de texte avec le nom d'utilisateur et une autre colonne avec une liste déroulante affichant tous les commentaires faits par l'utilisateur.

La définition DataGrid est comme ceci:

 <DataGrid AutoGenerateColumns="False" [layout options...] Name="dataGrid1" ItemsSource="{Binding}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}"/> 
      <DataGridComboBoxColumn Header="Comments" 
       SelectedValueBinding="{Binding Path=UserID}" 
       SelectedValuePath="ID" 
       DisplayMemberPath="Title" 
       ItemsSource="{Binding Path=Comments}" 
       /> 
     </DataGrid.Columns> 
    </DataGrid> 

dans le code J'assigne le DataContext comme ceci:

dataGrid1.DataContext = entities.Users; 

L'entité utilisateur dispose d'une propriété nommée Commentaires qui mène à tous les commentaires par l'utilisateur. Les requêtes renvoient des données et les noms d'utilisateur sont affichés mais la liste déroulante n'est pas remplie.

Peut-être que l'approche est totalement fausse ou je manque juste un point très simple ici, je suis ouvert pour apprendre de meilleures méthodes pour le faire.

Merci

Répondre

1

J'ai déjà utilisé votre approche. Cela fonctionne, mais avec une mise en garde: la liste déroulante ne peut afficher que l'élément actuel pour un objet donné s'il figure dans sa liste de valeurs autorisées (ici entities.Users).

Vous direz "oui, mais c'est vrai, j'ai mis dans la liste Users". Malheureusement, ce n'est pas le cas. La comparaison par défaut pour les entités dans l'EF n'est pas basée sur EntityKeys (je suppose que c'est la comparaison par défaut, c'est-à-dire comparaison de référence), donc dans l'objet vous avez une référence à un objet, abd dans la liste référence à un autre (avec la même EntityKey pour les deux).

Ma solution est de surcharger la fonction de comparaison pour la classe User, avec une simple vérification de ID == ID. Remarque: Je ne dis pas que c'est la meilleure approche (cela peut avoir des conséquences indésirables dans le reste de votre code, par exemple), mais cela a bien fonctionné pour moi. Oh, et une recommandation générale n'est pas de lier directement les contrôles à IQueriables, mais au résultat de la fonction Execute (ou bien la requête sera exécutée deux fois contre la base de données), voir msdn pour plus de détails.

Questions connexes