私の上司は、コード化する非常に珍しいシナリオを発明するのが大好きです。私は非常に遅いバウンドのデータを表示するために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のもオンザフライで自動作成し、その列にすることが可能であるべきだと思う