2009-12-18 4 views
1

J'ai deux tables dans une base de données et j'utilise les structures d'entité et les services ria pour afficher les données dans une grille de données simple. Voici la base de données/structure EFSilverlight/xaml - affichage des données enfants dans une grille de données

Cars  Make 
-----  ---- 
CarId  MakeId 
Car  Make 
MakeId 

Dans mon Silverlight DataGrid Je veux montrer les deux colonnes suivantes, par exemple

Car  Make 
---  ----- 
Escort Ford 
Megane Renault 
Rav4  Toyota 

Je peux facilement lier à la table Cars et montrer les voitures, mais je peux « t travailler comment afficher la Marque pris de la table des enfants

le XAML que j'utilise pour configurer la grille de données se présente comme suit:

<datagrid:DataGrid x:Name="CarGrid" AutoGenerateColumns="False" MinHeight="100" IsReadOnly="True" ItemsSource="{Binding ElementName=MyData, Path=Data}"> 
        <datagrid:DataGrid.Columns> 

         <datagrid:DataGridTextColumn Header="Car" Binding="{Binding Car}"/> 
         <datagrid:DataGridTextColumn Header="Make" Binding="{Binding Cars.Make}"/> 
...... 

La source de données datagrid se lie à une méthode DomainDataSource "GetCars". Je ne suis pas sûr qu'il charge automatiquement la table enfant (je ne sais pas si je dois le dire explicitement ou non, et je n'ai aucune idée de comment le faire dans xaml).

Je suis sûr que je pourrais abandonner le xaml et le faire en C# mais j'essaye d'être un bon codeur et de le faire en xaml.

Répondre

1

À moins que vous ne le spécifiiez explicitement quelque part (en utilisant DataContext.LoadOptions de Linq-to-SQL par exemple), l'enregistrement enfant ne serait pas chargé automatiquement avec l'enregistrement parent.

Voilà comment cela se fait dans LINQ to SQL:

List<tblInventory> result; 
using (var dc = new SMDataContext()) 
{ 
    dc.Log = Console.Out; 
    var dlo = new DataLoadOptions(); 
    dlo.LoadWith<tblInventory>(x => x.tblItemInfo); 
    dc.LoadOptions = dlo; 
    var q = (from o in dc.tblInventories 
      select o).Take(10); 
    result = q.ToList(); 
} 

Et voici le journal résultant:

SELECT TOP 10 [t0].[fldItemPrivateSN], [t0].[fldCatNo], [t0].[fldSerNo], ... 
       ..., [t1].[fldWeight], [t1].[fldValue], ... 
FROM [dbo].[tblInventory] AS [t0] 
INNER JOIN [dbo].[tblItemInfo] AS [t1] ON [t1].[fldCatNo] = [t0].[fldCatNo] 
-- Context: SqlProvider(Sql2000) Model: AttributedMetaModel Build: 3.5.30729.1 

Mise à jour:, il semble également que vous liez à Cars.Make, essayez de vous lier à Car.Make à la place.

+0

Je sais à propos de LoadOptions, mais j'essaie de le faire dans xaml plutôt que C# – Calanus

+0

XAML ne sait pas à propos de SQL ou des requêtes ou autres, il se lie à une propriété. Si la propriété get accessor renvoie null, vous ne verrez rien. Il n'y a pas de magie ici. –

+0

"xaml se lie à une propriété" - exactement! Et j'essaie de me lier à la propriété Make de l'objet Cars, de la même manière que je lie à la propriété Car dans la table Cars. Veuillez également garder à l'esprit que j'utilise les services RIA et que je n'accède pas directement au FE. – Calanus

0

article traite Mike Hilberg une grande partie de ce que vous êtes intéressé par:

http://blogs.msdn.com/mikehillberg/archive/2009/03/26/implementing-selectedvalue-with-the-silverlight-combobox.aspx

comme le fait l'article de Manish Dalal:

http://weblogs.asp.net/manishdalal/archive/2008/09/28/combobox-in-datagrid.aspx

Même avec l'aide de ces exemples que j'eu du mal à mettre en œuvre le même genre de chose que vous (en utilisant MVVM à la main plutôt que RIA). Je me suis retrouvé avec un hack inélégant qui a compromis les objets sous-jacents (quelque chose que vous aimeriez éviter) et c'était assez difficile.

Bonne chance.

1

Vous devez modifier votre liaison pour la colonne Make à Car.Make et vous devez vous assurer que cette propriété est renseignée par EF.

Je suggère d'attacher un débogueur au service et inspecter ce qui sort de EF.

Vous pouvez également attacher le profileur SQL à votre instance SQL Server et voir quelle requête EF est en cours d'exécution.

2

Je trouve une bonne solution. Essayons ceci: http://jeffhandley.com/archive/2010/03/12/lookupdata.aspx

Ensuite, n'oubliez pas d '"inclure" votre table enfant dans la recherche de requête sur votre classe de service de domaine.

ex:

public IQueryable<Car> GetCars() 
{ 
    return this.ObjectContext.Cars.Include("Make"); 
} 

remplacent les noms avec votre propre. PS: n'oubliez pas de faire toutes les étapes indiquées par le blog.