Silverlight / xaml - отображение дочерних данных в сетке данных - PullRequest
1 голос
/ 18 декабря 2009

У меня есть две таблицы в базе данных, и я использую Entity Framework и RIA-сервисы для отображения данных в простой сетке данных. Вот база данных / EF структура

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

В моей таблице данных Silverlight я хочу показать следующие два столбца, например

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

Я легко могу привязаться к таблице Cars и показать автомобили, но не могу понять, как отобразить марку, взятую из дочернего стола

xaml, который я использую для настройки сетки данных, выглядит следующим образом:

<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}"/>
......

Источник данных сетки данных связывается с методом DomainDataSource "GetCars". Я не уверен, загружает ли она дочернюю таблицу автоматически (не уверен, должен ли я явно указать это или нет, и не знаю, как это сделать в xaml).

Я уверен, что мог бы отказаться от xaml и сделать это в c #, но я пытаюсь быть хорошим программистом и сделать это в xaml.

Ответы [ 4 ]

2 голосов
/ 24 февраля 2011

Я нахожу хорошее решение. Давайте попробуем это: http://jeffhandley.com/archive/2010/03/12/lookupdata.aspx

Тогда не забудьте "включить" вашу дочернюю таблицу в поиск Query в классе обслуживания домена.

например:

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

замените имена своими.

PS: не забудьте выполнить все действия, указанные в блоге.

1 голос
/ 30 декабря 2009

Вам необходимо изменить привязку для столбца Make на Car.Make, и вам нужно убедиться, что это свойство заполняется EF.

Я бы предложил подключить к сервису отладчик и проверить, что выходит из EF.

Вы также можете присоединить SQL Profiler к вашему экземпляру SQL Server и посмотреть, какой запрос EF выполняется.

1 голос
/ 29 декабря 2009

Если вы не укажете это где-то явно (например, используя DataContext.LoadOptions в Linq-to-SQL), дочерняя запись не будет автоматически загружаться с родительской записью.

Вот как это делается в 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();
}

И вот полученный лог:

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

Обновление: Кроме того, похоже, что вы привязываетесь к Cars.Make, попробуйте вместо этого привязаться к Car.Make.

0 голосов
/ 30 декабря 2009

В статье Майка Хилберга много интересного:

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

как и статья Маниша Далала:

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

Даже с помощью этих примеров я изо всех сил пытался реализовать то же, что и вы (используя ручной MVVM, а не RIA).

Я закончил с неэлегичным взломом, который скомпрометировал лежащие в основе объекты (что вы хотели бы избежать), и это было достаточно сложно.

Удачи.

...