У меня была похожая проблема, потому что пользователь мог определять столбцы сетки во время выполнения.
Я написал элемент управления, содержащий сетку данных xam и выставив свойство зависимостей DataSource для привязки модели к сетке (то есть к таблице данных).
Каждый раз, когда источник менялся (вы можете добавить прослушиватели событий для PropertyChanged и события FieldLayoutInitializing сетки), сетка динамически перерисовывалась путем очистки источника данных и сброса:
private void ReRenderGrid()
{
XamDataGrid.FieldLayouts.Clear();
XamDataGrid.ClearValue(DataPresenterBase.DataSourceProperty);
XamDataGrid.DataSource = DataSource.Data.DefaultView;
}
Столбцы переконфигурируются обработчиком события для следующего события, которое вызывается xamdatagrid после сброса источника данных grid:
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 реализованы аналогичным образом.