- 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ę :)