Att binda data från en databas till ett WPF-gränssnitt är en mycket användbar funktion, särskilt i större applikationer. Här går vi igenom hur du kan koppla en WPF-applikation till en databas och visa datan i gränssnittet med databindning.
DataGrid. Vi använder Entity Framework Core med en lokal SQLite-databas.
⚙️ Installera följande paket i ditt projekt:
dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
dotnet add package Microsoft.EntityFrameworkCore.Tools
📦 För Visual Studio
Gå till NuGet Package Manager och installera:
Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Sqlite Microsoft.EntityFrameworkCore.Toolspublic class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
📝 Förklaring: Detta är en enkel modell som representerar en person.
using Microsoft.EntityFrameworkCore;
public class AppDbContext : DbContext
{
public DbSet<Person> People { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("Data Source=people.db");
}
}
📝 Förklaring:
DbSet<Person> representerar tabellen i databasen. people.db.using System.Linq;
public static class DatabaseInitializer
{
public static void Initialize()
{
using (var context = new AppDbContext())
{
context.Database.EnsureCreated();
if (!context.People.Any())
{
context.People.AddRange(
new Person { Name = "Anna", Age = 25 },
new Person { Name = "Erik", Age = 30 },
new Person { Name = "Lisa", Age = 22 }
);
context.SaveChanges();
}
}
}
}
📝 Förklaring:
<Window x:Class="DatabaseBindingExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Databindning till Databas" Height="300" Width="400">
<Grid Margin="10">
<DataGrid ItemsSource="{Binding People}" AutoGenerateColumns="True" />
</Grid>
</Window>
📝 Förklaring:
DataGrid är bunden till en lista av personer via ItemsSource="{Binding People}". AutoGenerateColumns="True" gör att kolumnerna skapas automatiskt.using System.Collections.ObjectModel;
public class MainViewModel
{
public ObservableCollection<Person> People { get; set; }
public MainViewModel()
{
using (var context = new AppDbContext())
{
People = new ObservableCollection<Person>(context.People);
}
}
}
📝 Förklaring:
ObservableCollection<Person> används eftersom den automatiskt uppdaterar UI vid ändringar. public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DatabaseInitializer.Initialize(); // Skapa och fyll databasen
DataContext = new MainViewModel(); // Koppla ViewModel till UI
}
}
📝 Förklaring:
DataContext sätts till MainViewModel, så att UI kan binda mot datan.När du kör applikationen ser du en DataGrid med data från databasen:
| Id | Name | Age |
|---|---|---|
| 1 | Anna | 25 |
| 2 | Erik | 30 |
| 3 | Lisa | 22 |
Vill du kunna lägga till data direkt från UI? Vi kan göra det!
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" Margin="0,0,0,10">
<TextBox x:Name="NameInput" Width="100" PlaceholderText="Namn"/>
<TextBox x:Name="AgeInput" Width="50" Margin="5,0" PlaceholderText="Ålder"/>
<Button Content="Lägg till" Width="75" Click="AddPerson_Click"/>
</StackPanel>
<DataGrid ItemsSource="{Binding People}" AutoGenerateColumns="True" Grid.Row="1"/>
</Grid>
private void AddPerson_Click(object sender, RoutedEventArgs e)
{
using (var context = new AppDbContext())
{
var person = new Person
{
Name = NameInput.Text,
Age = int.TryParse(AgeInput.Text, out int age) ? age : 0
};
context.People.Add(person);
context.SaveChanges();
}
// Uppdatera UI
DataContext = new MainViewModel();
}
📝 Förklaring: