Как добавить еще один столбец в XamDataGrid от Infragistics из другого источника данных или элементов данных?
У меня есть следующий Xaml для сетки данных, в которую я хочу добавить другой столбец, а затем заполнить этот столбец данными за пределами источника данных, используемого в настоящее время:
<igDP:XamDataGrid Grid.Row="0" Margin="10,10,188,10" Name="gateResourceLinksGrid" DataSource="{Binding}" VerticalAlignment="Stretch" AutoFit="True" IsNestedDataDisplayEnabled="False" AllowDrop="False" SelectedItemsChanged="gateResourceLinksGrid_SelectedItemsChanged" MouseDoubleClick="gateResourceLinksGrid_MouseDoubleClick">
<igDP:XamDataGrid.FieldSettings>
<igDP:FieldSettings AllowCellVirtualization="True" AutoSizeOptions="All" AllowEdit="False" />
</igDP:XamDataGrid.FieldSettings>
<igDP:XamDataGrid.FieldLayoutSettings>
<igDP:FieldLayoutSettings SelectionTypeCell="Range" SelectionTypeField="Range" SelectionTypeRecord="Single" />
</igDP:XamDataGrid.FieldLayoutSettings>
<igDP:XamDataGrid.FieldLayouts>
</igDP:XamDataGrid.FieldLayouts>
</igDP:XamDataGrid>
Тогда следующий код CS связан с этим:
Infragistics.Windows.DataPresenter.FieldLayout glo = new Infragistics.Windows.DataPresenter.FieldLayout();
glo.Fields.Add(new Infragistics.Windows.DataPresenter.Field("Field1", "Field one"));
glo.Fields.Add(new Infragistics.Windows.DataPresenter.Field("Field2", "Field two"));
gateResourceLinksGrid.FieldLayoutSettings.AutoGenerateFields = false;
glo.FieldSettings.AutoSizeOptions = Infragistics.Windows.DataPresenter.FieldAutoSizeOptions.All;
gateResourceLinksGrid.FieldLayouts.DataPresenter.AutoFit = true;
gateResourceLinksGrid.FieldLayoutSettings.AutoFitMode = Infragistics.Windows.DataPresenter.AutoFitMode.Default;
gateResourceLinksGrid.FieldLayouts.Add(glo);
gateResourceLinksGrid.DataSource = gateResourceLinksCol;
Это отлично работает,
Однако мне нужно добавить еще один столбец в этот xamdatagrid, который извлекает данные из другого источника данных, как бы я это сделал,
например: glo.Fields.Add(new Infragistics.Windows.DataPresenter.Field("Field3", "Field three"));
Я пытался обойти это с помощью:
gateResourceLinksGrid.DataItems.Add(attachedResources);
добавить данные для Field3, однако это дает мне сообщение об ошибке "Невозможно установить источник данных в datapresenter, в котором элементы явно добавлены через коллекцию dataitems". Есть идеи, пожалуйста?
Обновление / Решение
Поэтому я также связался со службой поддержки Infragistics, которая оперативно ответила решением, в котором было указано, как сопоставить данные с несвязанными полями. Как только я обернул голову вокруг этого, было довольно просто вставить другие данные в xamdatagrid, и этот шаблон мог использоваться другими, следовательно, поэтому я помещаю это здесь на SO.
Для любых данных вне назначенного нами источника данных вам нужно добавить несвязанное поле, а затем заполнить его данными, используя событие.
Первая строка нашего XAML становится:
<igDP:XamDataGrid Grid.Row="0" Margin="10" Name="gateResourceLinksGrid" VerticalAlignment="Stretch" AutoFit="True" IsNestedDataDisplayEnabled="False" AllowDrop="False"
SelectedItemsChanged="gateResourceLinksGrid_SelectedItemsChanged" MouseDoubleClick="gateResourceLinksGrid_MouseDoubleClick"
InitializeRecord="gateResourceLinksGrid_OnInitializeRecord">
Тогда наш код CS становится:
Infragistics.Windows.DataPresenter.FieldLayout glo = new Infragistics.Windows.DataPresenter.FieldLayout();
glo.Fields.Add(new Infragistics.Windows.DataPresenter.Field("Field1", "Field one"));
glo.Fields.Add(new Infragistics.Windows.DataPresenter.Field("Field2", "Field two"));
glo.Fields.Add(new Infragistics.Windows.DataPresenter.UnboundField());
glo.Fields[2].Name = "Field3";
glo.Fields[2].Label = "Field three";
gateResourceLinksGrid.FieldLayoutSettings.AutoGenerateFields = false;
glo.FieldSettings.AutoSizeOptions = Infragistics.Windows.DataPresenter.FieldAutoSizeOptions.All;
gateResourceLinksGrid.FieldLayouts.DataPresenter.AutoFit = true;
gateResourceLinksGrid.FieldLayoutSettings.AutoFitMode = Infragistics.Windows.DataPresenter.AutoFitMode.Default;
gateResourceLinksGrid.FieldLayouts.Add(glo);
gateResourceLinksGrid.DataSource = gateResourceLinksCol;
и мы добавляем следующую функцию для заполнения данных для Field3 при загрузке xamdatagrid.
private void gateResourceLinksGrid_OnInitializeRecord(object sender, Infragistics.Windows.DataPresenter.Events.InitializeRecordEventArgs e)
{
var dr = (Infragistics.Windows.DataPresenter.DataRecord)e.Record;
//dr.Cells["Field3"].Value = "333";
//This works and applies the value of 333
//to every cell in the Field3 column (for testing).
//Say our datasource is mapped to a table with pk = ID and this ID is also
//pk of the table we want to populate our data for Field3 from, but we want
//the NAME in our Field3 column.
foreach (Field3Row f3 in Field3Rows)//prepopulated list holding our data
{
if (dr.Cells["ID"].Value.ToString() == f3.ID.ToString() )
{
dr.Cells["Field3"].Value = f3.NAME;
break;
}
}
}