2011-07-05 20 views
1

私の上司は、コード化する非常に珍しいシナリオを発明するのが大好きです。私は非常に遅いバウンドのデータを表示するためにGridViewを使用しなければならないWPFアプリケーションを作っています。 データを表示するには、いくつかの列ヘッダーを持つGridViewを最初に初期化できることが必要ですが、問題はありません。次に、このGridView、DataTable、および一部の書式設定情報を、データをバインドするメソッドに渡す必要があります。WPFで動的に生成されたGridViewバインディング

デザイン時に、バインドするDataTableの列はわかりません。グリッド全体が動的に作成されるため、XAMLは使用できません。データをバインドするときには、列単位の書式設定データを指定する必要があります。私はこれまで、IValueConverterの実装として実装しました。IValueConverterは、そのコンストラクタのパラメータとして書式設定クラスを使用します。 最終的には、異なる方法でフォーマットされた同じ列を複数回データテーブルに表示することをサポートする必要があります。明らかに、名前の衝突があるため、1つのDataTableに複数のコピーを持つことはできません。

は、ここで私がこれまで持っているものです。

/// <summary> 
    /// Sets the view of the passed ListView to a new GridView with properly formatted headers. 
    /// The headers are also the field names (column names) of the data table that you will 
    /// bind to 
    /// </summary> 
    /// <param name="displayPanel"></param> 
    /// <param name="displayFieldList"></param> 
    public static void InitializeGrid(ListView displayPanel,IDisplayFieldList displayFieldList) 
    { 


     GridView gv = new GridView(); 
     gv.AllowsColumnReorder = true; 

     for (int i = 0; i < displayFieldList.Count; i++) 
     { 
      GridViewColumn col = new GridViewColumn(); 
      col.Header = displayFieldList[i].HeaderText; 

      gv.Columns.Add(col); 
     } 

     displayPanel.View = gv; 
    } 

    /// <summary> 
    /// Binds data to the columns set in the ListView.View. Displays and formats the data. 
    /// </summary> 
    /// <param name="displayPanel"></param> 
    /// <param name="table"></param> 
    /// <param name="displayFieldList"></param> 
    public static void BindData(ListView displayPanel, DataTable table, IDisplayFieldList displayFieldList) 
    { 
     for(int i=0; i<displayFieldList.Count; i++) 
     { 
      GridViewColumn gridCol = ((GridView)displayPanel.View).Columns[i]; 

      DmlDisplayField displayField = displayFieldList[i] as DmlDisplayField; 
      if(displayField != null) 
      { 
       gridCol.DisplayMemberBinding = new Binding() 
       { 
        Source = table.Columns[displayField.DataField], 
        Converter = new MaskConverter(displayField.DataField), 
        ConverterParameter = displayField 
       }; 
      } 
      else 
      { 
       gridCol.DisplayMemberBinding = new Binding() 
       { 
        Source = table.Columns[displayFieldList[i].Name] 
       }; 
      } 
     } 
     displayPanel.ItemsSource = table.AsDataView(); 
    } 

IDisplayFieldListは、メタデータを含むDisplayFieldまたはDmlDisplayFieldクラスのコレクションです。 MaskConverterは、さまざまな方法でDmlDisplayField列をフォーマットするIValueConverterです。

このコードを実行すると、すべての行が空白になりますが、個々の行を選択できます。

これまでのところ、私はさまざまなバインディング方法を試してきましたが、System.Reflectionの「あいまい一致の例外」がほとんどでした。

あなたは私がMaskConverterを投稿する必要がある場合は、私はしますが、それはかなり厄介だ...

任意のアイデア?ありがとう、トン!

ICustomTypeDescriptorインターフェイスはあなたを提供することができます...

を私は唯一のWinFormsのDataGridViewで同様のことをやったが、私は、WPF GridViewのもオンザフライで自動作成し、その列にすることが可能であるべきだと思う

答えて

0

グリッドに対するPropertyDescriptorsの独自のセット非常に同じプロパティ/列/フィールド/任意のものに対して2つの異なるプロパティ記述子を提供することができるので、同じプロパティ(記述子)に2つの列をバインドする必要はありません。

一方、この概念は過剰ですこれを行う簡単な方法があるかもしれないので、単なる提案です

関連する問題