DataSource for Entity Framework for WPF/Silverlight
ビューのカスタマイズ
DataSource for Entity Framework > ビューのカスタマイズ

さまざまな状況で、データベースから提供されるテーブルやビューに直接対応していないカスタムビューを使用したいことがあります。LINQ は、このような状況に最適なツールです。柔軟、簡潔、かつ効率的なクエリーステートメントと任意の言語を使用して、生データを変換できます。Entity Framework DataSource(EF DataSource)では、LINQ クエリーステートメントを動的に実行できるので、LINQ の機能がさらに強力になります。このため、この LINQ 実装は LiveLinq と呼ばれます。LiveLinq の機能については、「ライブビュー|document=WordDocuments\C1DataStudio-WPF.docx;topic=Live Views」で説明します。ここでは、完全な更新可能性と連結可能性を損なうことなく、LINQ 演算子を使用して自由にビューを変更し、形成できるということだけを伝えておきます。

さっそく、LINQ 演算子の1つである Select("プロジェクション" とも呼ばれます)を使用して、ビューのフィールド(プロパティ)をカスタマイズしてみます。

ビューをカスタマイズするには、次の手順に従います。

  1. 大規模なデータセット:ページング|document=WordDocuments\C1DataStudio-WPF.docx;topic=Large Datasets\: Paging」の説明で作成したプロジェクトを使用します。前と同様に、同じ ObjectContextType を使用して、C1DataSource コンポーネントを含む新しいフォームを追加します。このフォームをスタートアップフォームにすることで、プロジェクトの実行にかかる時間を短縮することができます。
  2. ViewSourceCollection エディタで ViewSource を作成します。サンプルデータベースの Products テーブルを使用します。
  3. ウィンドウデザイナにグリッドを追加し、前と同様に、その AutoGenerateColumns プロパティを True に設定します。ただし、今回は、コードでカスタムビューを作成するため、XAML でグリッドを C1DataSource に連結するのではなく、コードで連結します。
  4. 次のコードを使用して、カスタムライブビューを作成し、ビューにグリッドを連結します。
    Visual Basic
    コードのコピー
    dataGrid1.ItemsSource = _
        (From p In c1DataSource1("Products").AsLive(Of Product)()
          Select New With
          {
               p.ProductID,
               p.ProductName,
               p.CategoryID,
               p.Category.CategoryName,
               p.SupplierID,
               .Supplier = p.Supplier.CompanyName,
               p.UnitPrice,
               p.QuantityPerUnit,
               p.UnitsInStock,
               p.UnitsOnOrder
           }).AsDynamic()
    

    C#
    コードのコピー
    dataGrid1.ItemsSource =
        (from p in c1DataSource1["Products"].AsLive<Product>()
         select new
         {
             p.ProductID,
             p.ProductName,
             p.CategoryID,
             CategoryName = p.Category.CategoryName,
             p.SupplierID,
             Supplier = p.Supplier.CompanyName,
             p.UnitPrice,
             p.QuantityPerUnit,
             p.UnitsInStock,
             p.UnitsOnOrder
         }).AsDynamic();
    

    ここで、c1DataSource1["Products"] は1つの ClientCollectionView オブジェクトです。これは、デザイナで設定したビューソースに基づいて作成されるビューです(コードでビューソース自体にアクセスする必要がある場合は、c1DataSource.ViewSources["Products"] としてアクセスすることもできます)。AsLiveT_Method メソッド呼び出しは、ビューの項目タイプ(Product)を指定するために必要です。これにより、この項目に LiveLinq 演算子を適用できます。c1DataSource1["Products"].AsLive<Product>() の結果は1つの View<Product> です。C1.LiveLinq.LiveViews.View は、クライアント側ライブビューで使用される LiveLinq のメインクラスです。ライブビューに適用される LINQ 演算子は、ライブビューの更新可能性と連結可能性を維持します。これらは、通常と同じ LINQ 演算子ですが、ライブビューに適用されることで、データ連結アプリケーションに極めて重要な追加機能を提供します。

    メモ: ビューの結果セレクタ(select new 以下のコード)で匿名クラスを使用しているため、このビューには AsDynamic() を適用する必要があります。これは、匿名クラスに対してのみ課せられる LiveLinq の小さな制限です。このようなビューに AsDynamic() を追加し忘れると、例外によって通知されます。
  5. アプリケーションを保存、ビルド、および実行します。

    これで、この LiveLinq ビューの 'select' 句で定義した列がグリッドに表示されます。すべての列が変更可能であることにも注目してください。これは大したことに思えないかもしれませんが、ここで示すように行の追加や削除もサポートされる場合は特に、カスタマイズされたビューに独自に実装することが難しい重要な機能です。行の削除を試すには、行を選択し、Delete キーを押すだけです。行の追加を試すには、次のコードを実行するボタンをウィンドウに追加する必要があります。

    Visual Basic
    コードのコピー
    Dim newItem = CType(dataGrid1.ItemsSource, System.ComponentModel.IEditableCollectionView).AddNew()
    dataGrid1.ScrollIntoView(dataGrid1.Rows.Count - 1, 0)
    

    C#
    コードのコピー
    object newItem =
    ((System.ComponentModel.IEditableCollectionView)dataGrid1.ItemsSource).AddNew();
    dataGrid1.ScrollIntoView(newItem);
    

これが必要なのは、単に Microsoft WPF DataGrid には新しい行を追加するためのインタフェースが組み込まれていないためです。

連結可能性は、ビューが常に "ライブ" であり、静的データの単純なスナップショットではないことによって実現されます。これを証明するため、先ほどビルドしたフォームの正確な複製を構築します。この段階では、作成したフォームに簡単にアクセスできるように、アプリケーションにメニューを追加することも簡単でしょう。アプリケーションを保存、ビルド、および実行します。今回は、作成した2つのフォームインスタンスを開き、一方のフォームのグリッドでデータを変更します。もう一方のフォームのグリッドで、対応するデータが自動的に変更されることに注目してください。これらのフォームのグリッドに対して、行った変更を同期するためのコードを1行も記述していないことを思い出してください。

ライブビュー|document=WordDocuments\C1DataStudio-WPF.docx;topic=Live Views」では、その他の LiveLinq の機能について確認します。