DataSource for Entity Framework for WinForms
WPF での LiveLinq 実装

このセクションでは、同じアプリケーションの別バージョンを作成します。今回は WPF を使用します。

手順は次のとおりです。

  1. 新しい WPF アプリケーションを作成します。
  2. [データ]→[新しいデータソースの追加]メニューを使用して、NORTHWND.MDF データベースへの参照を追加します。ウィザードに表示されるデフォルトのオプションをすべて受け入れ、さらにデータベース内のテーブルをすべて選択します。
  3. プロジェクトに C1.LiveLinq.dll アセンブリへの参照を追加します。
  4. C1.WPF.C1DataGrid などのグリッドコントロールへの参照を追加します。このコントロールは、www.componentone.com からダウンロードできます。
  5. コントロール(1つの ComboBox、1つの C1DataGrid、4つの TextBox コントロール、5つの Label コントロール)をメインウィンドウに追加します。アプリケーションの前のバージョンに合わせて、次の図に示すようにコントロールのレイアウトを調整します。

 

 

ウィンドウを右クリックして[コードの表示]を選択し、プロジェクトに次のコードを追加します。


コードのコピー
using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using C1.LiveLinq;
using C1.LiveLinq.AdoNet;
using C1.LiveLinq.LiveViews;

namespace LiveLinqWPF
{
  ///<summary>
  ///Window1.xaml の操作ロジック
  ///</summary>
  public partial class Window1 : Window
  {
    public Window1()
    {
      // デザイナが生成したコード
      InitializeComponent();

      // データを取得します
      var ds = GetData();

      // Categories および Products を使用してライブビューを作成します
      var liveView =
        from c in ds.Categories.AsLive()
        join p in ds.Products.AsLive()
          on c.CategoryID equals p.CategoryID into g
        select new
        {
          CategoryID = c.CategoryID,
          CategoryName = c.CategoryName,
          Products = g
        };

      // ビューをコントロールに連結します
      DataBind(liveView);
    }
  }
}
   

このコードは、前に WinForms バージョンのアプリケーションを記述したときのコードと同じです。GetData を呼び出して DataSet に SQL データをロードし、データをアプリケーションに公開する LiveLinq ビューを作成します。最後に、DataBind メソッドを呼び出して、コントロールを LiveLinq ビューに連結します。

GetData メソッドも、WinForms バージョンのアプリケーションで使用したものと同じです。


コードのコピー
NORTHWNDDataSet GetData()
{
  NORTHWNDDataSet ds = new NORTHWNDDataSet();
  new NORTHWNDDataSetTableAdapters.ProductsTableAdapter()
    .Fill(ds.Products);
  new NORTHWNDDataSetTableAdapters.CategoriesTableAdapter()
    .Fill(ds.Categories);
  return ds;
}
   

DataBind メソッドは、前に記述したものに似ていますが、同じではありません。WPF のデータ連結メカニズムは WinForms のメカニズムと多少異なり、それがここに現れています。


コードのコピー
void DataBind(System.Collections.IEnumerable dataSource)
{
    // ComboBox にカテゴリを表示します
    comboBox1.ItemsSource = dataSource;
    comboBox1.DisplayMemberPath = "CategoryName";
    comboBox1.SelectedIndex = 0;

    // C1DataGrid に製品を表示します
    var b = new Binding("SelectedValue.Value.Products");
    b.Source = comboBox1;
    c1DataGrid1.SetBinding(C1.WPF.C1DataGrid.C1DataGrid.ItemsSourceProperty, b);

    // TextBox コントロールに製品の詳細を表示します
    BindControl(textBox1, "ProductName");
    BindControl(textBox2, "UnitPrice");
    BindControl(textBox3, "QuantityPerUnit");
    BindControl(textBox4, "UnitsInStock");
}

void BindControl(TextBox txt, string dataMember)
{
    var b = new Binding("SelectedGridItem.Row.DataItem." + dataMember);
    b.Source = c1DataGrid1;
    txt.SetBinding(TextBox.TextProperty, b);
}
   

WPF バージョンの DataBind メソッドは、最初に、ComboBox コントロールの ItemsSource プロパティにライブビューを割り当てます。また、ComboBoxDisplayMemberPath プロパティを "CategoryName" に設定します。これは、ComboBox に表示するフィールドです。

次に、SetBinding メソッドを使用して、グリッドの ItemsSource プロパティを ComboBox の選択項目に連結します。文字列 "SelectedValue.Value.Products" は、ComboBox で現在選択されている項目の "Products" フィールドを選択します。

最後に、SetBinding を使用して、各 TextBoxText プロパティをグリッドの選択項目の対応するフィールドに連結します。今回は、"SelectedGridItem.Row.DataItem.ProductName" のような文字列を使用して、グリッドで現在選択されている製品の特定のプロパティを選択しました。

これで、WPF バージョンのアプリケーションは完成です。ここでアプリケーションを実行すると、WinForms バージョンとまったく同様に動作することを確認できます。上の ComboBox からカテゴリを選択すると、下のグリッドに対応する製品が表示され、ウィンドウの下にある TextBox には製品の詳細が表示されます。