WPF Kullanmaya Başlarken
Bu adım adım kılavuzda, POCO türlerinin bir "ana ayrıntı" formunda WPF denetimlerine nasıl bağlanacağı gösterilmektedir. Uygulama, nesneleri veritabanındaki verilerle doldurmak, değişiklikleri izlemek ve verileri veritabanına kalıcı hale getirmek için Entity Framework API 'Lerini kullanır.
Model bire çok ilişkiye katılan iki tür tanımlar: Kategori (principal\main) ve ürün (bağımlılık \ ayrıntı). WPF veri bağlama çerçevesi ilgili nesneler arasında gezinmeyi sağlar: ana görünümdeki satırları seçme, ayrıntı görünümünün karşılık gelen alt verilerle güncelleştirilmesine neden olur.
bu izlenecek yolda ekran görüntüleri ve kod listeleri Visual Studio 2019 16.6.5 alınmıştır.
İpucu
Bu makalenin örneğini GitHubgörüntüleyebilirsiniz.
Önkoşullar
bu izlenecek yolu tamamlamak için, .net masaüstü iş yükü seçiliyken Visual Studio 2019 16,3 veya sonraki bir sürüme sahip olmanız gerekir. en son Visual Studio sürümünü yükleme hakkında daha fazla bilgi için bkz. yükleme Visual Studio.
Uygulamayı oluşturma
- Visual Studio’yu açın
- Başlangıç penceresinde Yeni proje oluştur' u seçin.
- "WPF" araması yapın WPF uygulaması (.NET Core) öğesini seçin ve ardından İleri' yi seçin.
- Sonraki ekranda projeye bir ad verin (örneğin, Getstartedwpf) ve Oluştur ' u seçin .
Entity Framework NuGet paketlerini yükler
çözüme sağ tıklayın ve çözüm için NuGet paketlerini yönet ' i seçin...

entityframeworkcore.sqliteArama kutusuna yazın.Microsoft. EntityFrameworkCore. SQLite paketini seçin.
Sağ bölmedeki projeyi kontrol edin ve ardından yükler ' e tıklayın.

entityframeworkcore.proxiesentityframeworkcore.proxiesaramak ve yüklemek için bu adımları tekrarlayın.
Not
SQLite paketini yüklediğinizde, ilgili Microsoft. EntityFrameworkCore temel paketini otomatik olarak çekti. Microsoft. EntityFrameworkCore. proxy paketi "yavaş yükleme" verileri için destek sağlar. Bu, alt varlıklar içeren varlıklarınız olduğunda, yalnızca üst öğeler ilk yük üzerinde getirilir. Proxy 'ler, alt varlıklara erişme denemesinin ne zaman yapıldığını algılar ve bunları isteğe bağlı olarak otomatik olarak yükler.
Model tanımlama
Bu kılavuzda, "önce Code" öğesini kullanarak bir model uygulayacaksınız. Bu, EF Core tanımladığınız C# sınıflarına göre veritabanı tablolarını ve şemayı oluşturacak anlamına gelir.
Yeni bir sınıf ekleyin. Buraya adı verin Product.cs ve şu şekilde doldurun:
Product.cs
namespace GetStartedWPF
{
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public int CategoryId { get; set; }
public virtual Category Category { get; set; }
}
}
Ardından, adlı bir sınıf ekleyin Category.cs ve aşağıdaki kodla doldurun:
Category.cs
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace GetStartedWPF
{
public class Category
{
public int CategoryId { get; set; }
public string Name { get; set; }
public virtual ICollection<Product>
Products
{ get; private set; } =
new ObservableCollection<Product>();
}
}
Product sınıfında category sınıfı ve category özelliğindeki Products özelliği gezinti özellikleridir. Entity Framework, gezinti özellikleri iki varlık türü arasında bir ilişkiye gitmek için bir yol sağlar.
Varlıkları tanımlamaya ek olarak, DbContext öğesinden türeten bir sınıf tanımlamanız ve DbSet TEntity özelliklerini kullanıma sunabilmeniz < gerekir > . DbSet < TEntity > özellikleri bağlamın modele hangi türleri dahil etmek istediğinizi bilmesini sağlar.
DbContext türetilmiş türünün bir örneği, çalışma zamanı sırasında varlık nesnelerini yönetir, bu da nesneleri bir veritabanındaki verilerle doldurmayı, değişiklik izlemeyi ve kalıcı verileri veritabanına getirmeyi içerir.
ProductContext.csAşağıdaki tanıma sahip projeye yeni bir sınıf ekleyin:
ProductContext.cs
using Microsoft.EntityFrameworkCore;
namespace GetStartedWPF
{
public class ProductContext : DbContext
{
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
protected override void OnConfiguring(
DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite(
"Data Source=products.db");
optionsBuilder.UseLazyLoadingProxies();
base.OnConfiguring(optionsBuilder);
}
}
}
- ,
DbSetHangi C# varlıklarının veritabanına eşlenmesi gerektiğini EF Core bilgilendirir. - EF Core yapılandırmak için çeşitli yollar vardır
DbContext. Bunlarla ilgili bilgi edinebilirsiniz: DbContext yapılandırma. - Bu örnek,
OnConfiguringbir SQLite veri dosyası belirtmek için override kullanır. - Bu
UseLazyLoadingProxiesçağrı EF Core yavaş yüklemeyi uygulamaya söyler, bu nedenle alt varlıklar üst öğeden erişildiğinde otomatik olarak yüklenir.
Projeyi derlemek için CTRL + SHIFT + B tuşlarına basın veya yapı oluşturma çözümüne gidin.
İpucu
Veritabanınızı ve EF Core modellerinizi eşitlenmiş durumda tutmanın farklı olduğunu öğrenin: veritabanı şemalarını yönetme.
Geç yükleme
Product sınıfında category sınıfı ve category özelliğindeki Products özelliği gezinti özellikleridir. Entity Framework Core, gezinti özellikleri iki varlık türü arasında bir ilişkiye gitmek için bir yol sağlar.
EF Core, gezinti özelliğine ilk kez eriştiğinizde ilgili varlıkları veritabanından otomatik olarak yükleme seçeneği sunar. Bu yükleme türü (yavaş yükleme olarak adlandırılır) ile, her gezinti özelliğine ilk kez eriştiğinizde, içerik bağlamda değilse veritabanına karşı ayrı bir sorgu yürütülecektir.
"Düz eski C# nesnesi" (POCO) varlık türlerini kullanırken EF Core, çalışma zamanı sırasında türetilmiş proxy türlerinin örneklerini oluşturarak ve sonra yükleme kancasını eklemek için sınıflarınızda sanal özellikleri geçersiz kılarak geç yüklemeye erişir. ilgili nesnelerin geç yüklemesini almak için, gezinti özelliği alıcıları ' ı public ve virtual (Visual Basic) olarak bildirmeniz gerekir ve sınıfınızın mühürlenmesigerekir (Visual Basic içindeNotOverridable ). Database First kullanırken, yavaş yüklemeyi etkinleştirmek için gezinti özellikleri otomatik olarak sanal hale getirilir.
Nesneyi denetimlere bağlama
Modelde tanımlanan sınıfları bu WPF uygulaması için veri kaynağı olarak ekleyin.
Ana formu açmak için Çözüm Gezgini MainWindow. xaml öğesine çift tıklayın
XAML 'yi düzenlemek için xaml sekmesini seçin.
Açılış etiketinden hemen sonra
Window, EF Core varlıklarına bağlanmak için aşağıdaki kaynakları ekleyin.<Window x:Class="GetStartedWPF.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:GetStartedWPF" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded"> <Window.Resources> <CollectionViewSource x:Key="categoryViewSource"/> <CollectionViewSource x:Key="categoryProductsViewSource" Source="{Binding Products, Source={StaticResource categoryViewSource}}"/> </Window.Resources>Bu, "üst" kategorilerin kaynağını ve "ayrıntı" ürünleri için ikinci kaynağı ayarlar.
Ardından, açılış etiketinden sonra XAML 'nize aşağıdaki biçimlendirmeyi ekleyin
Grid.<DataGrid x:Name="categoryDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding Source={StaticResource categoryViewSource}}" Margin="13,13,43,229" RowDetailsVisibilityMode="VisibleWhenSelected"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding CategoryId}" Header="Category Id" Width="SizeToHeader" IsReadOnly="True"/> <DataGridTextColumn Binding="{Binding Name}" Header="Name" Width="*"/> </DataGrid.Columns> </DataGrid>,
CategoryIdReadOnlyVeritabanı tarafından atandığı ve değiştirilemediğinden, olarak ayarlandığını unutmayın.
Ayrıntı Kılavuzu ekleme
Artık kılavuz, kategorileri görüntülemek için mevcut olduğuna göre, ürünleri göstermek için ayrıntılar kılavuzu eklenebilir. Bu Grid öğeyi Kategoriler öğesinden sonra öğesi içine ekleyin DataGrid .
MainWindow.xaml
<DataGrid x:Name="productsDataGrid" AutoGenerateColumns="False"
EnableRowVirtualization="True"
ItemsSource="{Binding Source={StaticResource categoryProductsViewSource}}"
Margin="13,205,43,108" RowDetailsVisibilityMode="VisibleWhenSelected"
RenderTransformOrigin="0.488,0.251">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding CategoryId}"
Header="Category Id" Width="SizeToHeader"
IsReadOnly="True"/>
<DataGridTextColumn Binding="{Binding ProductId}" Header="Product Id"
Width="SizeToHeader" IsReadOnly="True"/>
<DataGridTextColumn Binding="{Binding Name}" Header="Name" Width="*"/>
</DataGrid.Columns>
</DataGrid>
Son olarak, Save Click olayına öğesine bir düğme ve tel ekleyin Button_Click .
<Button Content="Save" HorizontalAlignment="Center" Margin="0,240,0,0"
Click="Button_Click" Height="20" Width="123"/>
Tasarım görünümlerinizin şöyle görünmesi gerekir:

Veri etkileşimini Işleyen kod ekleme
Ana pencereye bazı olay işleyicileri ekleme zamanı.
XAML penceresinde, ana pencereyi seçmek için pencere > öğesine tıklayın.
Özellikler penceresinde, sağ üst köşedeki Olaylar ' ı seçin ve ardından yüklenen etiketin sağ tarafındaki metin kutusuna çift tıklayın.

Bu, sizi form için arka plan koduna getirir, artık, ProductContext veri erişimi gerçekleştirmek için kullanmak üzere kodu düzenliyoruz. Kodu aşağıda gösterildiği gibi güncelleştirin.
Kod, uzun süreli çalışan bir örneğini bildirir ProductContext . ProductContextNesnesi, verileri sorgulamak ve veritabanına kaydetmek için kullanılır. Dispose()Örnek üzerinde yöntemi, ProductContext geçersiz kılınan OnClosing yöntemden çağrılır. Kod açıklamaları her adımın ne yaptığını açıklar.
MainWindow.xaml.cs
using Microsoft.EntityFrameworkCore;
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;
namespace GetStartedWPF
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private readonly ProductContext _context =
new ProductContext();
private CollectionViewSource categoryViewSource;
public MainWindow()
{
InitializeComponent();
categoryViewSource =
(CollectionViewSource)FindResource(nameof(categoryViewSource));
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// this is for demo purposes only, to make it easier
// to get up and running
_context.Database.EnsureCreated();
// load the entities into EF Core
_context.Categories.Load();
// bind to the source
categoryViewSource.Source =
_context.Categories.Local.ToObservableCollection();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
// all changes are automatically tracked, including
// deletes!
_context.SaveChanges();
// this forces the grid to refresh to latest values
categoryDataGrid.Items.Refresh();
productsDataGrid.Items.Refresh();
}
protected override void OnClosing(CancelEventArgs e)
{
// clean up database connections
_context.Dispose();
base.OnClosing(e);
}
}
}
Not
Kod, EnsureCreated() ilk çalıştırmada veritabanını oluşturmak için bir çağrısı kullanır. Bu, tanıtımlar için kabul edilebilir, ancak üretim uygulamalarında, şemanızı yönetmek için geçişlere bakmanız gerekir. Kod aynı zamanda yerel bir SQLite veritabanı kullandığından zaman uyumlu olarak yürütülür. Genellikle uzak bir sunucuyu içeren üretim senaryolarında ve yöntemlerinin zaman uyumsuz sürümlerini kullanmayı düşünün LoadSaveChanges .
WPF uygulamasını test etme
F5 tuşuna basarak veya hata ayıklama başlatma hata ayıklamayıseçerek uygulamayı derleyin ve çalıştırın. Veritabanı adlı bir dosya ile otomatik olarak oluşturulmalıdır products.db . Bir kategori adı girin ve ENTER tuşuna basın, daha sonra ürünleri daha düşük kılavuza ekleyin. Kaydet ' e tıklayın ve veritabanı tarafından belirtilen kimlikler ile kılavuz yenilemeyi izleyin. Satırı kaldırmak için bir satırı vurgulayın ve Delete tuşuna basın. Kaydet' e tıkladığınızda varlık silinir.

Özellik değişikliği bildirimi
Bu örnek, varlıkların Kullanıcı arabirimiyle eşitlenmesi için dört adım kullanır.
- İlk çağrı
_context.Categories.Load()Kategoriler verilerini yükler. - Yavaş yükleme proxy 'leri, bağımlı ürün verilerini yükler.
- EF Core yerleşik değişiklik izlemesi, eklemeler ve silmeler de dahil olmak üzere varlıklarda çağrıldıklarında gerekli
_context.SaveChanges()değişiklikleri yapar. - Yeni oluşturulan
DataGridView.Items.Refresh()kimliklerle yeniden yüklemeyi zorlamak için çağrıları.
Bu, başlarken örneğimizde işe yarar, ancak diğer senaryolar için ek kod gerekli olabilir. WPF denetimleri, varlıklarınız üzerinde alanları ve özellikleri okuyarak kullanıcı arabirimini işler. Kullanıcı arabiriminde (UI) bir değeri düzenlerken, bu değer varlığınıza geçiri. Bir özelliğin değerini doğrudan varlığınıza (örneğin, veritabanından yükleme) değiştirmelisiniz, WPF değişiklikleri kullanıcı arabiriminde hemen yansıtmaz. İşleme altyapısına değişiklikler bildirilecek. Proje bunu el ile çağırarak Refresh() yaptı. Bu bildirimi otomatikleştirmenin kolay bir yolu, INotifyPropertyChanged arabirimini uygulamaktır. WPF bileşenleri arabirimi otomatik olarak algılar ve değişiklik olayları için kaydolacaktır. Varlığın sorumluluğu bu olayları ifade eder.
İpucu
Değişiklikleri işleme hakkında daha fazla bilgi edinmek için şu makaleyi okuyun: Özellik değişikliği bildirimi uygulama.