Привязка данных результатов запроса LINQ (с таблицами соединения) к DataGrid - PullRequest
2 голосов
/ 15 февраля 2011

В моем настольном приложении WPF 4 у меня есть запрос LINQ, который выполняет соединение с двумя таблицами.

Вот код функции, которая возвращает результаты запроса LINQ:

public IList GetTableData()
{
    IList dataList = (from dWorker in App.glidusContext.tbl_workers
         join d2 in App.glidusContext.tbl_workers_has_tbl_events
         on dWorker.workerID equals d2.workerID
         where dWorker.workerTZ == strSplit
         select new { dWorker, d2 }).ToList();
    return data list;
}

Теперь все, что мне остается сделать - это привязать данные этого запроса LINQ к DataGrid:

private IList currentData; //class property

public void AssignTableContentToDataContext()
{
currentData = GetTableData();
this.ContentDataGrid.DataContext = currentData;
}

А вот XAML-код DataGrid:

            <DataGrid x:Name="ContentDataGrid"
                  Style="{StaticResource Body_Content_DataGrid}"
                  CellStyle="{StaticResource Body_Content_DataGrid_Centering}"
                  ItemsSource="{Binding}"
                  KeyboardNavigation.TabIndex="8" SelectionChanged="ContentDataGrid_SelectionChanged" DataContext="{Binding}">
            <!--  PreviewKeyDown="DBRecord_Delete_PreviewKeyDown" -->
            <!--  CellEditEnding="ContentDataGrid_CellEditEnding" -->
            <DataGrid.Columns>
                <DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_WorkerID}"
                                    Width="130"
                                    IsReadOnly="True"
                                    Binding="{Binding Path=workerID}" />
                                <DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_workerTZ}"
                                        Width="130"
                                        Binding="{Binding Path=workerTZ}" />
                <DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_WorkerFirstName}"
                                    Width="130"
                                    Binding="{Binding Path=workerFirstName}" />
                <DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_WorkerLastName}"
                                    Width="130"
                                    Binding="{Binding Path=workerLastName}" />
                <DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_EventID}"
                                    Width="130"
                                    Binding="{Binding Path=eventID}" />
                <DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_EventName}"
                                    Width="*"
                                    Binding="{Binding Path=eventName}" />
            </DataGrid.Columns>
        </DataGrid>

После отладки я получил следующие результаты:

  1. Мой запрос возвращает строки с результатами
  2. Мой DataGrid показывает строки в соответствии с количеством строк в результате запроса, но онипусто!

Так как мне связать эти данные и показать их в DataGrid?

PS В случае более простого запроса, например select * from _table_, все работает нормально и DataGrid показывает данные, но когда я использую более сложные запросы с более чем одной таблицей (make join), я не могу правильно связать их с данными.

Ответы [ 2 ]

2 голосов
/ 14 декабря 2012

Вам не нужно использовать псевдоним сущности в вашем обязывающем предложении. Просто поместите имя столбца в предложение Binding

<DataGridTextColumn Width="200" Header="CPF" IsReadOnly="True" Binding="{Binding Path=NumeroDoc}">

Удалите .ToList () из вашего кода, возвращая объект IEnumerable

public static IEnumerable getQueryTable()
    {
        var dataList = (from c in App.DbContext.Cliente
                 join d in App.DbContext.DadosDocumento
                 on c.IDCliente equals d.IDCliente
                 select new { c.IDCliente, c.Nome, c.DataCadastro, d.NumeroDoc });
        return dataList;
    }

И заполните сетку данных, используя свойство ItemsSource:

dgDados.ItemsSource = DBHelper.getQueryTable();

У меня отлично работает.

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

LINQ объединение работает не так, как SQL присоединение.Он не объединяет разные источники в одном простом источнике.Поэтому измените каждую привязку в DataGrid, как в этом примере:

{Binding Path=workerID}

для

{Binding Path=dWorker.workerID}

или d2.workerID, я не знаю свойств этих классов, ноошибка в привязках.

И не забудьте установить IsReadOnly="True" в DataGrid, потому что в противном случае возникнет исключение, если начать редактирование.

...