我遇到了类似的问题,因为用户能够在运行时定义网格的列。
我编写了一个包含 xam 数据网格的控件,并公开了一个 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 以类似的方式实现。