An object-oriented and type-safe programming language that has its roots in the C family of languages and includes support for component-oriented programming.
Hello @NicoCord ,
Thanks for your question.
In WPF, inside RowDetailsTemplate, the DataContext is already the current row’s Wire object, so the nested grid should bind its ItemsSource to SubWires.
You can refer to following code example:
public class Wire
{
public int WIWireID { get; set; }
public string WireNum { get; set; }
public string Type { get; set; }
public string Category { get; set; }
public List<SubWire> SubWires { get; set; } = new List<SubWire>();
}
public class SubWire
{
public int SubWireNum { get; set; }
public string Printing { get; set; }
public string Gauge { get; set; }
public string Color { get; set; }
}
Bind the parent grid ItemsSource to a list of Wire.
In RowDetailsTemplate, bind the child grid ItemsSource="{Binding SubWires}".
<DataGrid x:Name="dgvPreview"
AutoGenerateColumns="False"
IsReadOnly="True"
RowDetailsVisibilityMode="Collapsed">
<DataGrid.Columns>
<DataGridTemplateColumn Width="Auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Expander Expanded="Expander_Expanded"
Collapsed="Expander_Collapsed"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="#" Binding="{Binding WIWireID}"/>
<DataGridTextColumn Header="Wire" Binding="{Binding WireNum}"/>
<DataGridTextColumn Header="Type" Binding="{Binding Type}"/>
<DataGridTextColumn Header="Category" Binding="{Binding Category}"/>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid IsReadOnly="True"
AutoGenerateColumns="False"
ItemsSource="{Binding SubWires}"
Margin="15,8,8,8">
<DataGrid.Columns>
<DataGridTextColumn Header="#" Binding="{Binding SubWireNum}"/>
<DataGridTextColumn Header="Printing" Binding="{Binding Printing}"/>
<DataGridTextColumn Header="Gauge" Binding="{Binding Gauge}"/>
<DataGridTextColumn Header="Color" Binding="{Binding Color}"/>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
In code-behind, instead of adding directly to dgvPreview.Items, build a List<Wire> and assign it:
private void FillPreviewDgv(int workInstructionId)
{
List<Wire> wires = new List<Wire>();
viewWorkinstructionsDetailsTableAdapter.FillByWorkInstructionID(
harnessesCostDataSet.ViewWorkinstructionsDetails,
workInstructionId);
var wiRows = (HarnessesCostDataSet.ViewWorkinstructionsDetailsRow[])
harnessesCostDataSet.ViewWorkinstructionsDetails.Select("", "WireNum");
Wire current = null;
string lastWireNum = null;
foreach (var wiRow in wiRows)
{
if (lastWireNum != wiRow.WireNum)
{
current = new Wire
{
WIWireID = wiRow.WIWireID,
WireNum = wiRow.WireNum,
Type = wiRow.Type,
Category = wiRow.Category,
SubWires = GetSubWire(wiRow.WIWireID)
};
wires.Add(current);
lastWireNum = wiRow.WireNum;
}
}
dgvPreview.ItemsSource = wires;
}
Child loader stays basically the same:
private List<SubWire> GetSubWire(int wireId)
{
List<SubWire> subWires = new List<SubWire>();
wiSubWireTableAdapter.FillByWIWireID(harnessesCostDataSet.WISubWire, wireId);
var subWireRows = (HarnessesCostDataSet.WISubWireRow[])
harnessesCostDataSet.WISubWire.Select("WIWireID = " + wireId);
foreach (var row in subWireRows)
{
subWires.Add(new SubWire
{
SubWireNum = row.SubWireNum,
Printing = row.Printing,
Gauge = row.Gauge,
Color = row.Color
});
}
return subWires;
}
I hope this addresses your question. If this response was helpful, please consider following the guidance to provide feedback.