チュートリアル: Entity Data Model への WPF コントロールのバインド
このチュートリアルでは、データ バインド コントロールを含む WPF アプリケーションを作成します。コントロールは、エンティティ データ モデルでカプセル化された顧客レコードにバインドします。また、顧客レコード間の移動に使用できるボタンの追加と、レコードに対する変更の保存も行います。
このチュートリアルでは、次の作業について説明します。
WPF アプリケーションと、AdventureWorksLT サンプル データベースのデータから生成されるエンティティ データ モデルを作成する。
[データ ソース] ウィンドウからエンティティを WPF デザイナー内のウィンドウにドラッグして、データ バインド コントロール セットを作成する。
顧客レコード間を前後に移動するためのボタンを作成する。
コントロールへの変更を、エンティティ データ モデルおよび基になるデータ ソースに保存するボタンを作成する。
[!メモ]
お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。
必須コンポーネント
このチュートリアルを実行するには、次のコンポーネントが必要です。
Visual Studio
AdventureWorksLT サンプル データベースがアタッチされた、SQL Server または SQL Server Express の実行中のインスタンスへのアクセス。AdventureWorksLT データベースは、CodePlex の Web サイトからダウンロードできます。
次の概念に関する予備知識があると役に立ちますが、チュートリアルを完了するうえで必須ではありません。
エンティティ データ モデルおよび ADO.NET Entity Framework。詳細については、「Introducing the Entity Framework」を参照してください。
WPF デザイナーの操作。詳細については、「WPF および Silverlight デザイナーの概要」を参照してください。
WPF のデータ バインディング。詳細については、「データ バインディングの概要」を参照してください。
プロジェクトの作成
顧客レコードを表示するには、新しい WPF プロジェクトを作成します。
プロジェクトを作成するには
Visual Studio を起動します。
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[Visual Basic] または [Visual C#] を展開し、[Windows] を選択します。
[WPF アプリケーション] プロジェクト テンプレートを選択します。
[プロジェクト名] ボックスに「AdventureWorksCustomerEditor」と入力し、[OK] をクリックします。
Visual Studio によって、AdventureWorksCustomerEditor プロジェクトが作成されます。
アプリケーションで使用する Entity Data Model の作成
データ バインド コントロールを作成するには、アプリケーションで使用するデータ モデルを定義し、[データ ソース] ウィンドウに追加する必要があります。このチュートリアルでは、エンティティ データ モデルを作成します。
Entity Data Model を作成するには
[データ] メニューで、[新しいデータ ソースの追加] をクリックし、データ ソース構成ウィザードを起動します。
[データソースの種類を選択] ページで、[データベース] を選択し、[次へ] をクリックします。
[データベース モデルの選択] ページで、[Entity Data Model] をクリックし、[次へ] をクリックします。
[モデルのコンテンツの選択] ページで、[データベースから生成] をクリックし、[次へ] をクリックします。
[データ接続の選択] ページで、次のいずれかの操作を実行します。
AdventureWorksLT サンプル データベースへのデータ接続がドロップダウン リストに表示されている場合は、それを選択します。
または
[新しい接続] をクリックし、AdventureWorksLT データベースへの接続を作成します。
[エンティティ接続設定に名前を付けて App.Config に保存] オプションが選択されていることを確認し、[次へ] をクリックします。
[データベース オブジェクトの選択] ページで、[テーブル] を展開し、Customer テーブルを選択します。
[完了] をクリックします。
デザイナーで Model1.edmx ファイルが開きます。
プロジェクトをビルドします。
ウィンドウのユーザー インターフェイスの定義
WPF デザイナーで XAML を変更して、ボタンをウィンドウに追加します。
ウィンドウのユーザー インターフェイスを定義するには
ソリューション エクスプローラーで、MainWindow.xaml をダブルクリックします。
WPF デザイナーで、ウィンドウが開きます。
デザイナーの XAML ビューで、<Grid> タグの間に次のコードを追加します。
<Grid.RowDefinitions> <RowDefinition Height="75" /> <RowDefinition Height="425" /> </Grid.RowDefinitions> <Button HorizontalAlignment="Left" Margin="22,20,0,24" Name="backButton" Width="75"><</Button> <Button HorizontalAlignment="Left" Margin="116,20,0,24" Name="nextButton" Width="75">></Button> <Button HorizontalAlignment="Right" Margin="0,21,46,24" Name="saveButton" Width="110">Save changes</Button>
プロジェクトをビルドします。
データ バインド コントロールの作成
顧客レコードを表示するコントロールを作成するには、[データ ソース] ウィンドウから WPF デザイナーにオブジェクトをドラッグします。
データ バインド コントロールを作成するには
[データ] メニューの [データ ソースの表示] をクリックします。
[データ ソース] ウィンドウで、[Customers] ノードのドロップダウン メニューをクリックし、[詳細] を選択します。
[Customers] ノードを展開します。
この例では、いくつかのフィールドを非表示にするために、次のノードの横にあるドロップダウン メニューをクリックし、[なし] を選択します。
NameStyle
PasswordHash
PasswordSalt
rowGuid
ModifiedDate
[データ ソース] ウィンドウから、ボタンの下の領域に [Customers] ノードをドラッグします。
デザイナーで、[Customer ID] ラベルの横にあるテキスト ボックスをクリックします。
[プロパティ] ウィンドウで、IsReadOnly プロパティの横にあるチェック ボックスをオンにします。
プロジェクトをビルドします。
顧客レコード間の移動
ユーザーが [<] ボタンと [>] ボタンを使用して、顧客レコード間をスクロールできるようにするコードを追加します。
ユーザーが顧客レコード間を移動できるようにするには
デザイナーで、[<] ボタンをダブルクリックします。
Visual Studio で分離コード ファイルが開き、Click イベントに対する新しい backButton_Click イベント ハンドラーが作成されます。
Window_Loaded イベント ハンドラーを変更して、CustomersViewSource および AdventureWorksLTEntities がメソッドの外部で宣言され、フォーム全体からアクセスできるようにします。次に示すように、これらはフォームに対してのみグローバルに宣言し、Window_Loaded イベント ハンドラー内で割り当てます。
Dim CustomersViewSource As System.Windows.Data.CollectionViewSource Dim AdventureWorksLTEntities As AdventureWorksCustomerEditor.AdventureWorksLTEntities Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded CustomersViewSource = CType(Me.FindResource("CustomersViewSource"), System.Windows.Data.CollectionViewSource) AdventureWorksLTEntities = New AdventureWorksCustomerEditor.AdventureWorksLTEntities() 'Load data into Customers. You can modify this code as needed. Dim CustomersQuery As System.Data.Objects.ObjectQuery(Of AdventureWorksCustomerEditor.Customer) = Me.GetCustomersQuery(AdventureWorksLTEntities) CustomersViewSource.Source = CustomersQuery.Execute(System.Data.Objects.MergeOption.AppendOnly) End Sub
private System.Windows.Data.CollectionViewSource customersViewSource; private AdventureWorksCustomerEditor.AdventureWorksLTEntities adventureWorksLTEntities; private void Window_Loaded(object sender, RoutedEventArgs e) { adventureWorksLTEntities = new AdventureWorksCustomerEditor.AdventureWorksLTEntities(); // Load data into Customers. You can modify this code as needed. customersViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("customersViewSource"))); System.Data.Objects.ObjectQuery<AdventureWorksCustomerEditor.Customer> customersQuery = this.GetCustomersQuery(adventureWorksLTEntities); customersViewSource.Source = customersQuery.Execute(System.Data.Objects.MergeOption.AppendOnly); }
backButton_Click イベント ハンドラーに次のコードを追加します。
If CustomersViewSource.View.CurrentPosition > 0 Then CustomersViewSource.View.MoveCurrentToPrevious() End If
if (customersViewSource.View.CurrentPosition > 0) customersViewSource.View.MoveCurrentToPrevious();
デザイナーに戻り、[>] ボタンをダブルクリックします。
Visual Studio で分離コード ファイルが開き、Click イベントに対する新しい nextButton_Click イベント ハンドラーが作成されます。
nextButton _Click イベント ハンドラーに次のコードを追加します。
If CustomersViewSource.View.CurrentPosition < CType(CustomersViewSource.View, CollectionView).Count - 1 Then CustomersViewSource.View.MoveCurrentToNext() End If
if (customersViewSource.View.CurrentPosition < ((CollectionView)customersViewSource.View).Count - 1) customersViewSource.View.MoveCurrentToNext();
チェックポイント
プロジェクトをビルドして実行し、コードがコンパイルされていること、および顧客レコード間を移動できることを確認します。
アプリケーションをテストするには
F5 キーを押します。
アプリケーションがビルドされ、実行されます。次の点を確認します。
顧客データが表示されること。
[>] ボタンまたは [<] ボタンをクリックして、顧客レコード間を移動できること。
顧客レコードへの変更の保存
ユーザーが [Save changes] ボタンを使用して、顧客レコードへの変更を保存できるようにするコードを追加します。
顧客レコードへの変更を保存する機能を追加するには
デザイナーで、[Save changes] ボタンをダブルクリックします。
Visual Studio で分離コード ファイルが開き、新しい saveButton_Click イベント ハンドラーが作成されます。
saveButton_Click イベント ハンドラーに次のコードを追加します。
AdventureWorksLTEntities.SaveChanges()
adventureWorksLTEntities.SaveChanges();
アプリケーションのテスト
アプリケーションをビルドして実行し、顧客レコードが表示されること、および顧客レコードへの変更を保存できることを確認します。
アプリケーションをテストするには
F5 キーを押します。
いずれかの顧客レコードを編集し、[Save changes] をクリックします。
アプリケーションを終了し、F5 キーを押してアプリケーションを再起動します。
変更した顧客レコードに移動し、変更が保持されていることを確認します。
アプリケーションを閉じます。
次の手順
このチュートリアルを完了したら、関連する次の作業を行うことができます。
Visual Studio で [データ ソース] ウィンドウを使用して、WPF コントロールを他の種類のデータ ソースにバインドする方法を学習する。詳細については、「チュートリアル: WCF Data Service への WPF コントロールのバインド」および「チュートリアル: データセットへの WPF コントロールのバインド」を参照してください。
Visual Studio で [データ ソース] ウィンドウを使用して、関連するデータ (つまり、親子のリレーションシップを持つデータ) を WPF コントロールで表示する方法を学習する。詳細については、「チュートリアル: WPF アプリケーションでの関連データの表示」を参照してください。
参照
処理手順
方法: Visual Studio でデータに WPF コントロールをバインドする
チュートリアル: データセットへの WPF コントロールのバインド
チュートリアル: WCF Data Service への WPF コントロールのバインド
概念
Visual Studio でのデータへの WPF コントロールのバインド