2010-10-10 9 views
2

J'essaie de remplir un DataGrid avec un type anonyme généré par une requête LINQ. Lorsque je place les résultats de la requête dans une zone de liste, cela semble correct. Cependant, lorsque je place les résultats de la requête dans une grille de données, le nombre correct de lignes est généré, mais les cellules sont vides.Silverlight: Empty Data Grid

Silverlight screen cap showing the error

(La grille de données est sur la gauche, avec la zone de liste à droite.)

Affectation de la source de données:

testListBox.ItemsSource = debtPerUser.ItemsSource = ExpenseViewModel.getDebtData(username); 

Le XAML:

<sdk:DataGrid Height="222" HorizontalAlignment="Left" Margin="31,89,0,0" Name="debtPerUser" VerticalAlignment="Top" Width="516" AutoGenerateColumns="True" /> 
<ListBox Height="222" HorizontalAlignment="Left" Margin="567,89,0,0" Name="testListBox" VerticalAlignment="Top" Width="173" /> 

Que pourrais-je faire de mal ici?

getDebtData:

internal static IEnumerable getDebtData(string username) 
    { 
     IEnumerable<String> users = getUsersInvolving(username); 

     var debt = from user in users 
        select new { 
        User = user, 
        Net = owedBetween(username, user) - owedBetween(user, username) 
        }; 

     return debt.Where(d => d.Net != 0); 
    } 

Mise à jour: Il fonctionne quand je ne suis pas en utilisant un type de requête anonyme. Peut-être que c'est le problème?

+0

En fait, il s'affiche très bien dans la version de bureau de l'application, mais comme ça dans le navigateur, si ennuyeux! Une autre raison pour vider Silverlight – Coops

Répondre

2

Oui, les types anonymes sont conçus pour être utilisés dans la méthode qu'ils sont déclarés dans. Révéler les dehors peuvent mener à des résultats mauvais. J'utiliserais un énumérable fortement typé dans ce cas.

+1

+1: pour être technique la raison pour laquelle cela ne fonctionne pas est que les types anonymes sont internes. La liaison requiert que les types impliqués soient visibles par l'assembly System.Windows et, par conséquent, cela nécessite généralement que ces types soient publics. Cela peut être contourné au degré en ajoutant l'attribut d'assembly 'InternalsVisibleTo' et en spécifiant le nom fort pour l'assembly System.Windows. – AnthonyWJones

+0

@AnthonyWJones Je voudrais encore +1 si je pouvais, c'était exactement ça. Je viens de rendre public mon type d'entreprise personnalisé et cela a fonctionné. C'est très étrange dans mon cas, car toutes les autres pages de mon application Silverlight fonctionnent bien avec les types personnalisés privés – Coops

0

Sans savoir exactement quel type de collection la méthode ExpenseViewModel.getDebtData rendement, si elle est LINQ, vous pourriez avoir un peu de chance d'essayer ExpenseViewModel.getDebtData(username).ToList()

+0

Il renvoie 'IEnumerable', mais le type de' ItemsSource' est 'IEnumerable' aussi, donc je ne pense pas que ce soit le problème. De plus, le type de retour n'a pas de méthode 'ToList()'. –