ユーザーが実行時にグリッドの列を定義できたため、同様の問題が発生しました。
xam datagridを含み、グリッドのモデル(つまりデータテーブル)をバインドするためにDataSource依存関係プロパティを公開するコントロールを作成しました。
ソースが変更されるたびに(PropertyChangedイベントとグリッドFieldLayoutInitializingイベントのイベントリスナーを追加できます)、グリッドはデータソースをクリアしてリセットすることで動的に再レンダリングされました。
private void ReRenderGrid()
{
XamDataGrid.FieldLayouts.Clear();
XamDataGrid.ClearValue(DataPresenterBase.DataSourceProperty);
XamDataGrid.DataSource = DataSource.Data.DefaultView;
}
列は、グリッドデータソースがリセットされた後にxamdatagridによって発生する次のイベントのイベントハンドラーによって再構成されます。
XamDataGrid.FieldLayoutInitializing += LayoutInitializing;
ハンドラ:
private void LayoutInitializing(object sender, FieldLayoutInitializingEventArgs e)
{
const string deletebuttonstyle = "DeleteButtonStyle";
const string requiredinputvalue = "RequiredInputValue";
const string optionalinputvalue = "OptionalInputValue";
const string outputvalue = "OutputValue";
var fieldLayout = e.FieldLayout;
fieldLayout.Fields.Clear();
AddFields(DataSource.InColumns, requiredinputvalue, fieldLayout);
AddSplitter(fieldLayout);
AddFields(DataSource.OptionalInColumns, optionalinputvalue, fieldLayout);
AddSplitter(fieldLayout);
AddFields(DataSource.OutColumns, outputvalue, fieldLayout);
AddUnboundField(fieldLayout, string.Empty, GetStyle(deletebuttonstyle));
}
私の場合、データソースにはユーザーが構成したすべての列が含まれていました。AddFieldsは、リストエントリごとに次のメソッドを呼び出します。
private void AddField(string name, Style style, FieldLayout fieldLayout)
{
var field = new Field {Name = name};
field.Settings.LabelPresenterStyle = style;
field.Settings.CellValuePresenterStyle = GetStyle("StandardCellValueStyle");
fieldLayout.Fields.Add(field);
}
AddSplitterとAddUnboundFieldは、同様の方法で実装されます。