我有一個自定義數據結構,我需要一個WPF組件,它將代表我的數據結構。組件應該看起來像一張圖片。組件應該是動態的,因此結構中的ColumnSets的數量可以從1到x。並且每個columnSet可以有不同的列數。WPF嵌套數據網格爲自定義數據結構
public class CustomStructure{
public List<ColumnSet> ColumnSets{get; set;}
}
public class ColumnSet{
public string Name { get; set; }
public List<Column> ColumnSets{get;}
}
public class Column{
public string Name { get; set; }
public List<int> Data{get;}
}
第一行表示來自類ColumnSet的Name屬性。第二行是類Column的Name屬性。其他行是來自Column類的Data。
Wanted WPF component design (image)
我的解決方案
我定義的兩個組成部分。首先表示外部表,它被稱爲FuzzyTableControl。它有X列和只有一行。 第二個表示FuzzyTableControl的第一行中每列的FuzzyInnerTableControl。
FuzzyTableControl.xaml
<UserControl:Class="FuzzyTableControl">
<UserControl.DataContext>
<viewModel:FuzzyTableViewModel/>
</UserControl.DataContext>
<DataGrid AutoGenerateColumns="True" IsReadOnly="True"
CanUserAddRows="False"
CanUserDeleteRows="False"
ItemsSource="{Binding DataTable}">
// here is problem 1
<DataGrid.Columns>
<DataGridTemplateColumn Header="{Binding}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<view:FuzzyInnerTableControl/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</UserControl>
FuzzyTableViewModel.cs
public class FuzzyTableViewModel : BaseViewModel
{
public FuzzyTable Table { get; set; }
public DataTable DataTable { get; set; }
public FuzzyTableViewModel()
{
Table = FuzzyTable.Generate(3, 2);
DataTable = new DataTable();
foreach (var attribute in Table.Attributes)
{
DataTable.Columns.Add(new DataColumn(attribute.Name));
}
var row = new List<object>();
foreach (var attribute in Table.Attributes)
row.Add(attribute);
DataTable.Rows.Add(row.ToArray());
}
}
FuzzyInnerTableControl.xaml 這一個工程好
<UserControl:Class="FuzzyInnerTableControl">
<UserControl.DataContext>
<viewModel:FuzzyInnerTableViewModel/>
</UserControl.DataContext>
<DataGrid ItemsSource="{Binding DataTable}"/>
</UserControl>
FuzzyInnerTableViewModel.cs
public class FuzzyInnerTableViewModel : BaseViewModel
{
public DataTable DataTable { get; }
public ColumnSetDouble ColumnSetDouble { get; set; }
public FuzzyInnerTableViewModel()
{
// test
var table = FuzzyTable.Generate(3, 2);
ColumnSetDouble = table.ClassAttribute;
//end test
DataTable = new DataTable();
foreach (var attribute in ColumnSetDouble.Columns)
DataTable.Columns.Add(new DataColumn(attribute.Name));
for (int rowId = 0; rowId < ColumnSetDouble.Columns[0].Data.Count; rowId++)
{
var row = new List<object>();
foreach (var column in ColumnSetDouble.Columns)
{
row.Add(column.Data[rowId]);
}
DataTable.Rows.Add(row.ToArray());
}
}
}
我不知道如何爲FuzzyTableControl的每一列定義單元格模板。此解決方案創建新列,但我需要從viewModel動態加載列。
數據網格通常是通過一個行集合,其中每一行有一些列的屬性來表示。在嘗試顯示之前,您可能希望將數據轉換爲基於行的結構。 – grek40
如果您想知道如何顯示多個表格,您應該已經知道如何顯示一個表格(一個'ColumnSet')並將其包含在您的問題中。否則,你應該先弄清楚如何顯示單個表格,而不用擔心很多表格。問題是要儘可能廣泛。 – grek40
我剛添加更多的細節問題。 – Patrik