2010-10-10 5 views
2

Я пытаюсь заполнить DataGrid анонимным типом, сгенерированным запросом LINQ. Когда я помещаю результаты запроса в список, это выглядит нормально. Однако, когда я помещаю результаты запроса в сетку данных, генерируется правильное количество строк, но ячейки пустые.Silverlight: Empty Data Grid

Silverlight screen cap showing the error

(Сетка данных находится на левой стороне, с коробкой списка справа.)

Назначение источника данных:

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

Часть 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" /> 

Что я могу делать неправильно здесь?

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); 
    } 

Update: Это работает, когда я не использую анонимный тип запроса. Возможно, это проблема?

+0

Это действительно хорошо отображается в настольной версии приложения, но, как в браузере, так раздражает! Еще одна причина сброса Silverlight – Coops

ответ

2

Да, анонимные типы предназначены для использования в способе они объявлены. Разоблачение их внешность может привести к злым исходам. В этом случае я использовал бы типично типизированный перечислимый.

+1

+1: техническая причина, по которой это не работает, заключается в том, что анонимные типы являются внутренними. Связывание требует, чтобы типы были видимыми для сборки System.Windows, и, следовательно, это обычно требует, чтобы эти типы были общедоступными. Это можно обойти до степени, добавив атрибут сборки InternalsVisibleTo' и указав сильное имя сборки System.Windows. – AnthonyWJones

+0

@ AnthonyWJones Я бы добавил +1, если бы мог, это было именно так. Я просто опубликовал свой собственный тип бизнеса, и он сработал. Это очень странно в моем случае, потому что все остальные страницы моего приложения Silverlight работают с частными пользовательскими типами – Coops

0

Не зная точно, какой тип сбора возвращается метод ExpenseViewModel.getDebtData, если он использует LINQ вы можете иметь некоторые удачи пытаются ExpenseViewModel.getDebtData(username).ToList()

+0

Он возвращает 'IEnumerable', но тип' ItemsSource' также 'IEnumerable', поэтому я не думаю, что это проблема. Кроме того, тип возврата не имеет метода «ToList()». –