Problem z wyświetleniem danych z bazy w DataGrid

0

Cześć :)
Mój problem polega na tym, że nie mogę wyświetlić danych z bazy (relacje jeden do wielu) w DataGrid. Wiem, że DataGrid przymuje listę więc mam takie zapytanie:

var query = context.Contractors.Where(a => a.Id==id).ToList();

XAML wygląda tak:

<DataGrid x:Name="dataGrid" Margin="0,10,0,0" VerticalAlignment="Top" Height="520" AutoGenerateColumns="False" ItemsSource="{Binding}"
                       AlternationCount="2" SelectionMode="Single" CanUserSortColumns="True">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Adres" Binding="{Binding Address}" />
                        <DataGridTextColumn Header="Numer telefonu" Binding="{Binding NumberPhone}" />
                        <DataGridTextColumn Header="E-Mail" Binding="{Binding Email}" />
                        <DataGridTextColumn Header="Zdalny pulpit" Binding="{Binding RemoteDesktop}" />
                        <DataGridTextColumn Header="Hasło" Binding="{Binding PasswordRemoteDesktop}" />
                    </DataGrid.Columns>
</DataGrid>

W debugerze jest tak:
title

Czyli dane z 3 tabel są zapakowane, a nie mam już żadnego pomysłu jak to odpakować żeby było dobrze.
Z góry dziękuję za pomoc!

0
  • Pchanie klas reprezentujących encje z bazy danych do widoku to proszenie się o kłopoty. Tak się nie powinno robić;
  • Czyli dane z 3 tabel są zapakowane, a nie mam już żadnego pomysłu jak to odpakować żeby było dobrze. - powinieneś utworzyć coś co nazywa się DTO. Jest to klasa, która przetransportuje warstwę wyżej rozpakowane dane z Twoich encji. Takie dane jakich potrzebuje logika Twojej aplikacji już po wyselectowaniu ich z bazy danych.
  • Kolekcja, którą zbindujesz jako ItemsSource musi być typu ObservableCollection<T>;
  • Obiekt, który bindujesz do każdej z kolumn musi odpowiadać fizycznie publicznej własności w klasie, której kolekcję udostępniasz gridowi np:

[Binding NumberPhone} odpowiada:

class Phone
{
	public string NumberPhone { get; set; }
	// ... i inne własności
}

co z kolei należy udostępnić widokowi jako: public ObservableCollection<Phone> Phones { get; set; } // ...w dużym skrócie, bo lepiej IList<Phone>... i zbindować jako ItemsSource="{Binding Phones}"

To Ci zadziała jeżeli nie będziesz zmieniał danych z kolekcji w kodzie i pchał zmian do widoku. Jeżeli będziesz chciał zmieniać dane pod spodem i wyświetlać takie zmiany w widoku zainteresuj się implementacją INotifyPropertyChanged i czymś co nazywa się viewmodel.

W dużym, dużym skrócie:

**Code-behind: **zadziała ale pisanie w WPF bez MVVM to trochę masochizm:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;

namespace _4p
{
    public class Phone
    {
        public int Number { get; set; }
    }
    public partial class MainWindow : Window
    {
        public IList<Phone> Phones { get; private set; }

        public MainWindow()
        {
            InitializeComponent();

            this.Phones = new ObservableCollection<Phone>();
            for (int i = 0; i < 10; i++)
                this.Phones.Add(new Phone { Number = i });

            this.DataContext = this;
        }
    }
}

XAML:

<Window x:Class="_4p.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_4p"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid ItemsSource="{Binding Phones}"
                  AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Number" Binding="{Binding Number}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

PS: Ludzie... jak ja to napisałem. Ale w pracy jestem, spieszę się :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1