WPF ile veri bağlamaDatabinding with WPF

Önemli

Bu belge yalnızca .NET Framework WPF için geçerlidirThis document is valid for WPF on the .NET Framework only

Bu belge .NET Framework WPF için veri bağlamayı açıklar.This document describes databinding for WPF on the .NET Framework. Yeni .NET Core projeleri için Entity Framework 6 yerine EF Core kullanmanızı öneririz.For new .NET Core projects, we recommend you use EF Core instead of Entity Framework 6. EF Core ' de veri bağlama belgeleri şunlardır: WPF Ile çalışmayabaşlama.The documentation for databinding in EF Core is here: Getting Started with WPF.

Bu adım adım kılavuzda, POCO türlerinin bir "ana-ayrıntı" formunda WPF denetimlerine nasıl bağlanacağı gösterilmektedir.This step-by-step walkthrough shows how to bind POCO types to WPF controls in a “master-detail" form. 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.The application uses the Entity Framework APIs to populate objects with data from the database, track changes, and persist data to the database.

Model bire çok ilişkiye katılan iki tür tanımlar: Kategori (asıl \ ana) ve ürün (bağımlı \ ayrıntı).The model defines two types that participate in one-to-many relationship: Category (principal\master) and Product (dependent\detail). Daha sonra, Visual Studio Araçları modelde tanımlanan türleri WPF denetimlerine bağlamak için kullanılır.Then, the Visual Studio tools are used to bind the types defined in the model to the WPF controls. 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.The WPF data-binding framework enables navigation between related objects: selecting rows in the master view causes the detail view to update with the corresponding child data.

Bu izlenecek yolda ekran görüntüleri ve kod listeleri Visual Studio 2013 alınmıştır ancak Visual Studio 2012 veya Visual Studio 2010 ile bu yönergeyi tamamlayabilirsiniz.The screen shots and code listings in this walkthrough are taken from Visual Studio 2013 but you can complete this walkthrough with Visual Studio 2012 or Visual Studio 2010.

WPF veri kaynakları oluşturmak için ' nesne ' seçeneğini kullanınUse the 'Object' Option for Creating WPF Data Sources

Entity Framework önceki sürümüyle, EF Designer ile oluşturulmuş bir modele dayalı yeni bir veri kaynağı oluştururken veritabanı seçeneğini kullanmanızı öneririz.With previous version of Entity Framework we used to recommend using the Database option when creating a new Data Source based on a model created with the EF Designer. Bunun nedeni, tasarımcının ObjectContext 'ten türetilen ve EntityObject öğesinden türetilen varlık sınıflarından bir bağlam üretmesidir.This was because the designer would generate a context that derived from ObjectContext and entity classes that derived from EntityObject. Veritabanı seçeneğini kullanmak, bu API yüzeyine etkileşimde bulunmak için en iyi kodu yazmanıza yardımcı olur.Using the Database option would help you write the best code for interacting with this API surface.

Visual Studio 2012 ve Visual Studio 2013 için EF tasarımcıları, basit POCO varlık sınıflarıyla birlikte DbContext 'ten türeten bir bağlam oluşturur.The EF Designers for Visual Studio 2012 and Visual Studio 2013 generate a context that derives from DbContext together with simple POCO entity classes. Visual Studio 2010 ile, bu kılavuzda daha sonra açıklandığı gibi DbContext kullanan bir kod oluşturma şablonuna değiştirmeyi öneririz.With Visual Studio 2010 we recommend swapping to a code generation template that uses DbContext as described later in this walkthrough.

DbContext API yüzeyini kullanırken, bu kılavuzda gösterildiği gibi yeni bir veri kaynağı oluştururken nesne seçeneğini kullanmanız gerekir.When using the DbContext API surface you should use the Object option when creating a new Data Source, as shown in this walkthrough.

Gerekirse, EF Designer ile oluşturulan modeller için ObjectContext tabanlı kod oluşturmaya döndürebilirsiniz .If needed, you can revert to ObjectContext based code generation for models created with the EF Designer.

ÖnkoşullarPre-Requisites

Bu izlenecek yolu tamamlamak için Visual Studio 2013, Visual Studio 2012 veya Visual Studio 2010 yüklü olmalıdır.You need to have Visual Studio 2013, Visual Studio 2012 or Visual Studio 2010 installed to complete this walkthrough.

Visual Studio 2010 kullanıyorsanız, NuGet ' i de yüklemelisiniz.If you are using Visual Studio 2010, you also have to install NuGet. Daha fazla bilgi için bkz. NuGet 'ı yükleme.For more information, see Installing NuGet.  

Uygulamayı oluşturmaCreate the Application

  • Visual Studio’yu açınOpen Visual Studio
  • Dosya- > Yeni- > proje....File -> New -> Project….
  • Sol bölmedeki Windows' u   ve sağ bölmedeki WPFApplication ' u seçinSelect Windows in the left pane and WPFApplication in the right pane
  •  WPFwithEFSample   Ad olarak WPFwithEFSample girinEnter WPFwithEFSample as the name
  •  Tamam 'ı seçinSelect OK

Entity Framework NuGet paketini yüklerInstall the Entity Framework NuGet package

  • Çözüm Gezgini, Winformyüzthefsample projesine sağ tıklayınIn Solution Explorer, right-click on the WinFormswithEFSample project
  • NuGet Paketlerini Yönet... seçeneğini belirleyin.Select Manage NuGet Packages…
  • NuGet Paketlerini Yönet iletişim kutusunda çevrimiçi sekmesini seçin ve EntityFramework paketini seçinIn the Manage NuGet Packages dialog, Select the Online tab and choose the EntityFramework package
  • Install 'a tıklayınClick Install

    Not

    EntityFramework derlemesine ek olarak, System. ComponentModel. Dataaçıklamalarda bir başvuru de eklenir.In addition to the EntityFramework assembly a reference to System.ComponentModel.DataAnnotations is also added. Projenin System. Data. Entity başvurusu varsa, EntityFramework paketi yüklendiğinde kaldırılır.If the project has a reference to System.Data.Entity, then it will be removed when the EntityFramework package is installed. System. Data. Entity derlemesi artık Entity Framework 6 uygulamaları için kullanılmıyor.The System.Data.Entity assembly is no longer used for Entity Framework 6 applications.

Model tanımlamaDefine a Model

Bu izlenecek yolda, Code First veya EF tasarımcısını kullanarak bir model uygulamayı seçebilirsiniz.In this walkthrough you can chose to implement a model using Code First or the EF Designer. Aşağıdaki iki bölümden birini doldurun.Complete one of the two following sections.

Seçenek 1: Code First kullanarak model tanımlamaOption 1: Define a Model using Code First

Bu bölümde, Code First kullanarak bir modelin ve ilişkili veritabanının nasıl oluşturulacağı gösterilmektedir.This section shows how to create a model and its associated database using Code First. Bir sonraki bölüme atlayın (seçenek 2: Database First kullanarak bir model tanımlayın) , bir VERITABANıNDAN, EF Designer kullanarak modelinize ters mühendislik uygulamak için Database First kullanmayı tercih ediyorsanızSkip to the next section (Option 2: Define a model using Database First) if you would rather use Database First to reverse engineer your model from a database using the EF designer

Code First geliştirme kullanılırken, genellikle kavramsal (etki alanı) modelinizi tanımlayan .NET Framework sınıfları yazarak başlarsınız.When using Code First development you usually begin by writing .NET Framework classes that define your conceptual (domain) model.

  • WPFwithEFSample için yeni bir sınıf ekleyin :Add a new class to the WPFwithEFSample:
    • Proje adına sağ tıklayınRight-click on the project name
    • Ekle' yi ve ardından Yeni öğe ' yi seçinSelect Add, then New Item
    • Sınıf Class adı için sınıfı seçin ve ürünügirin  Select Class and enter Product for the class name
  •  Ürün   sınıfı tanımını şu kodla değiştirin:Replace the Product class definition with the following code:
    namespace WPFwithEFSample
    {
        public class Product
        {
            public int ProductId { get; set; }
            public string Name { get; set; }

            public int CategoryId { get; set; }
            public virtual Category Category { get; set; }
        }
    }

-   Add a **Category** class with the following definition:

    using System.Collections.ObjectModel;

    namespace WPFwithEFSample
    {
        public class Category
        {
            public Category()
            {
                this.Products = new ObservableCollection<Product>();
            }

            public int CategoryId { get; set; }
            public string Name { get; set; }

            public virtual ObservableCollection<Product> Products { get; private set; }
        }
    }

Product sınıfında category sınıfı ve category özelliğindeki Products özelliği gezinti özellikleridir.The Products property on the Category class and Category property on the Product class are navigation properties. Entity Framework, gezinti özellikleri iki varlık türü arasında bir ilişkiye gitmek için bir yol sağlar.In Entity Framework, navigation properties provide a way to navigate a relationship between two entity types.

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 > .In addition to defining entities, you need to define a class that derives from DbContext and exposes DbSet<TEntity> properties. DbSet < TEntity > özellikleri bağlamın modele hangi türleri dahil etmek istediğinizi bilmesini sağlar.The DbSet<TEntity> properties let the context know which types you want to include in the model.

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.An instance of the DbContext derived type manages the entity objects during run time, which includes populating objects with data from a database, change tracking, and persisting data to the database.

  • Aşağıdaki tanıma sahip projeye yeni bir Productcontext sınıfı ekleyin:Add a new ProductContext class to the project with the following definition:
    using System.Data.Entity;

    namespace WPFwithEFSample
    {
        public class ProductContext : DbContext
        {
            public DbSet<Category> Categories { get; set; }
            public DbSet<Product> Products { get; set; }
        }
    }

Projeyi derleyin.Compile the project.

Seçenek 2: Database First kullanarak model tanımlamaOption 2: Define a model using Database First

Bu bölümde, EF Designer kullanarak bir veritabanından modelinize ters mühendislik uygulamak için Database First nasıl kullanılacağı gösterilmektedir.This section shows how to use Database First to reverse engineer your model from a database using the EF designer. Önceki bölümü (1. seçenek: Code First kullanarak model tanımlama) tamamladıysanız, bu bölümü atlayın ve doğrudan geç yükleme bölümüne gidin.If you completed the previous section (Option 1: Define a model using Code First), then skip this section and go straight to the Lazy Loading section.

Var olan bir veritabanı oluşturCreate an Existing Database

Genellikle, var olan bir veritabanını hedeflerken zaten oluşturulur, ancak bu izlenecek yol için, erişmek üzere bir veritabanı oluşturulması gerekir.Typically when you are targeting an existing database it will already be created, but for this walkthrough we need to create a database to access.

Visual Studio ile yüklenen veritabanı sunucusu, yüklediğiniz Visual Studio sürümüne bağlı olarak farklılık gösteren bir sürümdür:The database server that is installed with Visual Studio is different depending on the version of Visual Studio you have installed:

  • Visual Studio 2010 kullanıyorsanız, bir SQL Express veritabanı oluşturursunuz.If you are using Visual Studio 2010 you'll be creating a SQL Express database.
  • Visual Studio 2012 kullanıyorsanız, LocalDB veritabanı oluşturursunuz.If you are using Visual Studio 2012 then you'll be creating a LocalDB database.

Şimdi veritabanını oluşturalım.Let's go ahead and generate the database.

  • Görünüm- > Sunucu GezginiView -> Server Explorer

  • Veri bağlantıları ' na sağ tıklayın - > bağlantı ekle...Right click on Data Connections -> Add Connection…

  • Sunucu Gezgini bir veritabanına bağlı değilseniz, veri kaynağı olarak Microsoft SQL Server seçmeniz gerekirIf you haven’t connected to a database from Server Explorer before you’ll need to select Microsoft SQL Server as the data source

    Veri kaynağını Değiştir

  • Hangisini yüklediğinize bağlı olarak LocalDB 'ye veya SQL Express 'e bağlanın ve veritabanı adı olarak ürünleri girinConnect to either LocalDB or SQL Express, depending on which one you have installed, and enter Products as the database name

    Bağlantı LocalDB Ekle

    Bağlantı Express ekleme

  • Tamam ' ı seçtiğinizde, yeni bir veritabanı oluşturmak isteyip istemediğiniz sorulur, Evet ' i seçin.Select OK and you will be asked if you want to create a new database, select Yes

    Veritabanı Oluşturma

  • Yeni veritabanı artık Sunucu Gezgini görüntülenir, sağ tıklayıp Yeni sorgu ' yı seçin.The new database will now appear in Server Explorer, right-click on it and select New Query

  • Aşağıdaki SQL 'i yeni sorguya kopyalayın, ardından sorguya sağ tıklayıp Yürüt ' ü seçin.Copy the following SQL into the new query, then right-click on the query and select Execute

    CREATE TABLE [dbo].[Categories] (
        [CategoryId] [int] NOT NULL IDENTITY,
        [Name] [nvarchar](max),
        CONSTRAINT [PK_dbo.Categories] PRIMARY KEY ([CategoryId])
    )

    CREATE TABLE [dbo].[Products] (
        [ProductId] [int] NOT NULL IDENTITY,
        [Name] [nvarchar](max),
        [CategoryId] [int] NOT NULL,
        CONSTRAINT [PK_dbo.Products] PRIMARY KEY ([ProductId])
    )

    CREATE INDEX [IX_CategoryId] ON [dbo].[Products]([CategoryId])

    ALTER TABLE [dbo].[Products] ADD CONSTRAINT [FK_dbo.Products_dbo.Categories_CategoryId] FOREIGN KEY ([CategoryId]) REFERENCES [dbo].[Categories] ([CategoryId]) ON DELETE CASCADE

Tersine mühendislik modeliReverse Engineer Model

Modelimizi oluşturmak için Visual Studio 'nun bir parçası olarak dahil edilen Entity Framework Designer kullanacağız.We’re going to make use of Entity Framework Designer, which is included as part of Visual Studio, to create our model.

  • Proje- > Yeni öğe Ekle...Project -> Add New Item…

  • Sol menüden verileri seçin ve ardından ADO.net varlık veri modeliSelect Data from the left menu and then ADO.NET Entity Data Model

  • Ad olarak ProductModel girin ve Tamam 'a tıklayınEnter ProductModel as the name and click OK

  • Bu, varlık veri modeli Sihirbazı 'nı başlatırThis launches the Entity Data Model Wizard

  • Veritabanından oluştur ' u seçin ve İleri ' ye tıklayın.Select Generate from Database and click Next

    Model Içeriğini seçin

  • İlk bölümde oluşturduğunuz veritabanına bağlantıyı seçin, bağlantı dizesinin adı olarak Productcontext girin ve İleri ' ye tıklayın.Select the connection to the database you created in the first section, enter ProductContext as the name of the connection string and click Next

    Bağlantınızı seçin

  • Tüm tabloları içeri aktarmak için ' tablolar ' seçeneğinin yanındaki onay kutusuna tıklayın ve ' son ' a tıklayınClick the checkbox next to ‘Tables’ to import all tables and click ‘Finish’

    Nesnelerinizi seçin

Tersine mühendislik işlemi tamamlandıktan sonra, yeni model projenize eklenir ve Entity Framework Designer görüntülemeniz için açılır.Once the reverse engineer process completes the new model is added to your project and opened up for you to view in the Entity Framework Designer. Veritabanına yönelik bağlantı ayrıntılarına sahip bir App.config dosyası da projenize eklenmiştir.An App.config file has also been added to your project with the connection details for the database.

Visual Studio 2010 ' de ek adımlarAdditional Steps in Visual Studio 2010

Visual Studio 2010 ' de çalışıyorsanız, EF6 kod oluşturmayı kullanmak için EF tasarımcısını güncelleştirmeniz gerekir.If you are working in Visual Studio 2010 then you will need to update the EF designer to use EF6 code generation.

  • EF Designer 'daki modelinizin boş bir noktasına sağ tıklayıp kod oluşturma öğesi Ekle... seçeneğini belirleyin.Right-click on an empty spot of your model in the EF Designer and select Add Code Generation Item…
  • Sol menüden çevrimiçi şablonlar ' ı seçin ve DbContext ' i arayınSelect Online Templates from the left menu and search for DbContext
  • C Için EF 6. x DbContext oluşturucusunu seçin # , ad olarak Productsmodel girin ve Ekle ' ye tıklayın.Select the EF 6.x DbContext Generator for C#, enter ProductsModel as the name and click Add

Veri bağlama için kod üretimi güncelleştiriliyorUpdating code generation for data binding

EF, modelden T4 şablonları kullanarak kod oluşturur.EF generates code from your model using T4 templates. Visual Studio ile birlikte gelen veya Visual Studio galerisinden indirilen şablonlar genel amaçlı kullanım amaçlıdır.The templates shipped with Visual Studio or downloaded from the Visual Studio gallery are intended for general purpose use. Bu, bu şablonlardan oluşturulan varlıkların basit ICollection T özelliklerine sahip olduğu anlamına gelir < > .This means that the entities generated from these templates have simple ICollection<T> properties. Bununla birlikte, WPF kullanarak veri bağlama yaparken, WPF 'in koleksiyonlarda yapılan değişiklikleri izleyebilmesi için koleksiyon özellikleri için ObservableCollection kullanılması tercih edilir.However, when doing data binding using WPF it is desirable to use ObservableCollection for collection properties so that WPF can keep track of changes made to the collections. Bu uçta, ObservableCollection kullanmak için şablonları değiştiririz.To this end we will to modify the templates to use ObservableCollection.

  • Çözüm Gezgini açın ve ProductModel. edmx dosyasını bulunOpen the Solution Explorer and find ProductModel.edmx file

  • ProductModel. edmx dosyasının altında iç içe olacak ProductModel.tt dosyasını bulunFind the ProductModel.tt file which will be nested under the ProductModel.edmx file

    WPF ürün modeli şablonu

  • Visual Studio Düzenleyicisi 'nde açmak için ProductModel.tt dosyasına çift tıklayınDouble-click on the ProductModel.tt file to open it in the Visual Studio editor

  • "ICollection" sözcüğünün iki yinelemesini "ObservableCollection" ile bulur ve değiştirin.Find and replace the two occurrences of “ICollection” with “ObservableCollection”. Bunlar, 296 ve 484 satırlarında yaklaşık olarak bulunur.These are located approximately at lines 296 and 484.

  • İlk "HashSet" oluşumunu "ObservableCollection" ile bulur ve değiştirin.Find and replace the first occurrence of “HashSet” with “ObservableCollection”. Bu oluşum yaklaşık olarak 50. satırda bulunur.This occurrence is located approximately at line 50. Kodda daha sonra bulunan ikinci diyez kümesi oluşumunu değiştirmeyin.Do not replace the second occurrence of HashSet found later in the code.

  • Tek "System. Collections. Generic" oluşumunu "System. Collections. ObjectModel" ile bulur ve değiştirir.Find and replace the only occurrence of “System.Collections.Generic” with “System.Collections.ObjectModel”. Bu yaklaşık 424. satırda bulunur.This is located approximately at line 424.

  • ProductModel.tt dosyasını kaydedin.Save the ProductModel.tt file. Bu, varlıkların kodunun yeniden üretilmesine neden olmalıdır.This should cause the code for entities to be regenerated. Kod otomatik olarak yeniden oluşturmaz, ProductModel.tt 'e sağ tıklayın ve "özel araç Çalıştır" seçeneğini belirleyin.If the code does not regenerate automatically, then right click on ProductModel.tt and choose “Run Custom Tool”.

Artık Category.cs dosyasını (ProductModel.tt altında iç içe yerleştirilmiş) açarsanız, Products koleksiyonunun **ObservableCollection < Product > **türünde olduğunu görmeniz gerekir.If you now open the Category.cs file (which is nested under ProductModel.tt) then you should see that the Products collection has the type ObservableCollection<Product>.

Projeyi derleyin.Compile the project.

Geç yüklemeLazy Loading

Product sınıfında category sınıfı ve category özelliğindeki Products özelliği gezinti özellikleridir.The Products property on the Category class and Category property on the Product class are navigation properties. Entity Framework, gezinti özellikleri iki varlık türü arasında bir ilişkiye gitmek için bir yol sağlar.In Entity Framework, navigation properties provide a way to navigate a relationship between two entity types.

EF, gezinti özelliğine ilk kez eriştiğinizde ilgili varlıkları veritabanından otomatik olarak yükleme seçeneği sunar.EF gives you an option of loading related entities from the database automatically the first time you access the navigation property. 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.With this type of loading (called lazy loading), be aware that the first time you access each navigation property a separate query will be executed against the database if the contents are not already in the context.

POCO varlık türleri kullanılırken, EF, ç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.When using POCO entity types, EF achieves lazy loading by creating instances of derived proxy types during runtime and then overriding virtual properties in your classes to add the loading hook. İlgili nesnelerin geç yüklemesini almak için, gezinti özelliği alıcıları ' ı Public ve Virtual (Visual Basic) olarak bildirmeniz ve sınıfınız mühürlenmemelidir (Visual Basic içindeNotOverridable ).To get lazy loading of related objects, you must declare navigation property getters as public and virtual (Overridable in Visual Basic), and you class must not be sealed (NotOverridable in Visual Basic). Database First gezinti özelliklerinin kullanılması, yavaş yüklemeyi etkinleştirmek için otomatik olarak sanal hale getirilir.When using Database First navigation properties are automatically made virtual to enable lazy loading. Code First bölümünde, aynı nedenden dolayı gezinti özelliklerini sanal hale getirmeyi seçtikIn the Code First section we chose to make the navigation properties virtual for the same reason

Nesneyi denetimlere bağlamaBind Object to Controls

Modelde tanımlanan sınıfları bu WPF uygulaması için veri kaynağı olarak ekleyin.Add the classes that are defined in the model as data sources for this WPF application.

  • Ana formu açmak için Çözüm Gezgini MainWindow. xaml öğesine çift tıklayınDouble-click MainWindow.xaml in Solution Explorer to open the main form

  • Ana menüden Proje- > Yeni veri kaynağı Ekle... öğesini seçin.From the main menu, select Project -> Add New Data Source … (Visual Studio 2010 ' de, veri- > Yeni veri kaynağı Ekle...' i seçmeniz gerekir.)(in Visual Studio 2010, you need to select Data -> Add New Data Source…)

  • Bir veri kaynağı türü seçin penceresinde, nesne ' yi seçin ve İleri ' ye tıklayın.In the Choose a Data Source Typewindow, select Object and click Next

  • Veri nesnelerini seçin iletişim kutusunda, WPFwithEFSample   iki kez katlayın ve Kategori ' yi seçin.In the Select the Data Objects dialog, unfold the WPFwithEFSample two times and select Category
    Ürün veri kaynağını seçme gereksinimi yoktur, çünkü bu Işlem, Kategori veri kaynağındaki ürününözelliği aracılığıyla sunulacaktırThere is no need to select the Product data source, because we will get to it through the Product’s property on the Category data source

    Veri nesnelerini seçin

  • Son'a tıklayın.Click Finish.

  • Veri kaynakları penceresi açık değilse, MainWindow. xaml penceresinin yanında veri kaynakları penceresi açılır , Görünüm- > diğer Windows- > veri kaynakları ' nı seçinThe Data Sources window is opened next to the MainWindow.xaml window If the Data Sources window is not showing up, select View -> Other Windows-> Data Sources

  • Veri kaynakları penceresi otomatik olarak gizlenmemesi için Sabitle simgesine basın.Press the pin icon, so the Data Sources window does not auto hide. Pencere zaten görünür durumdaysa Yenile düğmesine vurması gerekebilir.You may need to hit the refresh button if the window was already visible.

    Data Sources

  •  Kategori veri kaynağını seçin ve form üzerine sürükleyin.Select the Category data source and drag it on the form.

Bu kaynağı sürüklediğiniz sırada şunlar oldu:The following happened when we dragged this source:

  • Categoryviewsource kaynağı ve CATEGORYDATAGRID denetimi xaml 'ye eklendiThe categoryViewSource resource and the categoryDataGrid control were added to XAML
  • Üst kılavuz öğesindeki DataContext özelliği "{StaticResource Categoryviewsource }" olarak ayarlandı.The DataContext property on the parent Grid element was set to "{StaticResource categoryViewSource }".Categoryviewsource kaynağı, dış üst kılavuz öğesi için bir bağlama kaynağı görevi görür \ . The categoryViewSource resource serves as a binding source for the outer\parent Grid element. İç kılavuz öğeleri daha sonra üst ızgaraya DataContext değerini devralınır (categoryDataGrid 'in ItemId özelliği "{Binding}" olarak ayarlanır)The inner Grid elements then inherit the DataContext value from the parent Grid (the categoryDataGrid’s ItemsSource property is set to "{Binding}")
    <Window.Resources>
        <CollectionViewSource x:Key="categoryViewSource"
                                d:DesignSource="{d:DesignInstance {x:Type local:Category}, CreateList=True}"/>
    </Window.Resources>
    <Grid DataContext="{StaticResource categoryViewSource}">
        <DataGrid x:Name="categoryDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True"
                    ItemsSource="{Binding}" Margin="13,13,43,191"
                    RowDetailsVisibilityMode="VisibleWhenSelected">
            <DataGrid.Columns>
                <DataGridTextColumn x:Name="categoryIdColumn" Binding="{Binding CategoryId}"
                                    Header="Category Id" Width="SizeToHeader"/>
                <DataGridTextColumn x:Name="nameColumn" Binding="{Binding Name}"
                                    Header="Name" Width="SizeToHeader"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>

Ayrıntı Kılavuzu eklemeAdding a Details Grid

Şimdi Kategoriler görüntüleyen bir kılavuza sahip olduğumuz ilgili ürünleri göstermek için bir ayrıntı Kılavuzu ekleyelim.Now that we have a grid to display Categories let's add a details grid to display the associated Products.

  •  Kategori veri kaynağı altında Products özelliğini seçin ve forma sürükleyin.Select the Products property from under the Category data source and drag it on the form.
    • Categoryproductsviewsource kaynağı ve PRODUCTDATAGRID Kılavuzu xaml 'ye eklenirThe categoryProductsViewSource resource and productDataGrid grid are added to XAML
    • Bu kaynak için bağlama yolu ürünler olarak ayarlandıThe binding path for this resource is set to Products
    • WPF veri bağlama çerçevesi yalnızca seçili kategoriyle ilgili ürünlerin Productdatagrid 'de görünmesini sağlarWPF data-binding framework ensures that only Products related to the selected Category show up in productDataGrid
  • Araç kutusu ' ndan düğme ' ye sürükleyin.From the Toolbox, drag Button on to the form. Name özelliğini Buttonsave , içerik özelliği ise Saveolarak ayarlayın.Set the Name property to buttonSave and the Content property to Save.

Form şuna benzer görünmelidir:The form should look similar to this:

Tasarımcı 

Veri etkileşimini Işleyen kod eklemeAdd Code that Handles Data Interaction

Ana pencereye bazı olay işleyicileri ekleme zamanı.It's time to add some event handlers to the main window.

  • XAML penceresinde, ** < pencere** öğesine tıklayın, bu, ana pencereyi seçerIn the XAML window, click on the <Window element, this selects the main window

  • Özellikler penceresinde, sağ üst köşedeki Olaylar ' ı seçin ve ardından yüklenen etiketin sağ tarafındaki metin kutusunu çift tıklatınIn the Properties window choose Events at the top right, then double-click the text box to right of the Loaded label

    Ana pencere özellikleri

  • Ayrıca, tasarımcıda Kaydet düğmesine çift tıklayarak Kaydet düğmesine ait Click olayını da ekleyin.Also add the Click event for the Save button by double-clicking the Save button in the designer. 

Bu, sizi form için arka plan koduna getirir, artık kodu, veri erişimi gerçekleştirmek için ProductContext 'i kullanacak şekilde düzenliyoruz.This brings you to the code behind for the form, we'll now edit the code to use the ProductContext to perform data access. MainWindow için kodu aşağıda gösterildiği gibi güncelleştirin.Update the code for the MainWindow as shown below.

Kod, Productcontext'in uzun süre çalışan bir örneğini bildirir.The code declares a long-running instance of ProductContext. Verileri sorgulamak ve veritabanına kaydetmek için Productcontext nesnesi kullanılır.The ProductContext object is used to query and save data to the database. Productcontext örneğindeki Dispose () , geçersiz kılınan OnClosing yönteminden çağırılır.The Dispose() on the ProductContext instance is then called from the overridden OnClosing method.Kod açıklamaları kodun ne yaptığını hakkında ayrıntılar sağlar. The code comments provide details about what the code does.

    using System.Data.Entity;
    using System.Linq;
    using System.Windows;

    namespace WPFwithEFSample
    {
        public partial class MainWindow : Window
        {
            private ProductContext _context = new ProductContext();
            public MainWindow()
            {
                InitializeComponent();
            }

            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                System.Windows.Data.CollectionViewSource categoryViewSource =
                    ((System.Windows.Data.CollectionViewSource)(this.FindResource("categoryViewSource")));

                // Load is an extension method on IQueryable,
                // defined in the System.Data.Entity namespace.
                // This method enumerates the results of the query,
                // similar to ToList but without creating a list.
                // When used with Linq to Entities this method
                // creates entity objects and adds them to the context.
                _context.Categories.Load();

                // After the data is loaded call the DbSet<T>.Local property
                // to use the DbSet<T> as a binding source.
                categoryViewSource.Source = _context.Categories.Local;
            }

            private void buttonSave_Click(object sender, RoutedEventArgs e)
            {
                // When you delete an object from the related entities collection
                // (in this case Products), the Entity Framework doesn’t mark
                // these child entities as deleted.
                // Instead, it removes the relationship between the parent and the child
                // by setting the parent reference to null.
                // So we manually have to delete the products
                // that have a Category reference set to null.

                // The following code uses LINQ to Objects
                // against the Local collection of Products.
                // The ToList call is required because otherwise the collection will be modified
                // by the Remove call while it is being enumerated.
                // In most other situations you can use LINQ to Objects directly
                // against the Local property without using ToList first.
                foreach (var product in _context.Products.Local.ToList())
                {
                    if (product.Category == null)
                    {
                        _context.Products.Remove(product);
                    }
                }

                _context.SaveChanges();
                // Refresh the grids so the database generated values show up.
                this.categoryDataGrid.Items.Refresh();
                this.productsDataGrid.Items.Refresh();
            }

            protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
            {
                base.OnClosing(e);
                this._context.Dispose();
            }
        }

    }

WPF uygulamasını test etmeTest the WPF Application

  • Uygulamayı derleyin ve çalıştırın.Compile and run the application. Code First kullandıysanız, sizin için bir WPFwithEFSample. ProductContext veritabanının oluşturulduğunu görürsünüz.If you used Code First, then you will see that a WPFwithEFSample.ProductContext database is created for you.

  • Üst kılavuza bir kategori adı girin ve birincil anahtar veritabanı tarafından oluşturulduğundan alt kılavuzdaki ürün adları ID sütunlarında hiçbir şey girmeyinEnter a category name in the top grid and product names in the bottom grid Do not enter anything in ID columns, because the primary key is generated by the database

    Yeni kategoriler ve ürünlerle ana pencere

  • Verileri veritabanına kaydetmek için Kaydet düğmesine basınPress the Save button to save the data to the database

DbContext 'in SaveChanges () çağrısından sonra, kimlikler veritabanı tarafından oluşturulan değerlerle doldurulur.After the call to DbContext’s SaveChanges(), the IDs are populated with the database generated values. SaveChanges () sonrasında Refresh ( ) çağırdığımız için DataGrid denetimleri yeni değerlerle de güncelleştirilir.Because we called Refresh() after SaveChanges() the DataGrid controls are updated with the new values as well.

Doldurulan kimlikleri içeren ana pencere

Ek KaynaklarAdditional Resources

WPF kullanarak koleksiyonlara veri bağlama hakkında daha fazla bilgi edinmek için WPF belgelerindeki Bu konuya bakın.To learn more about data binding to collections using WPF, see this topic in the WPF documentation.