【发布时间】:2017-03-06 12:06:16
【问题描述】:
我有一个自定义数据结构,我需要一个 WPF 组件来代表我的数据结构。组件应该看起来像图片。组件应该是动态的,因此结构中的 ColumnSet 数量可以从 1 到 x。并且每个 columnSet 可以有不同的列数。
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 类的数据。
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 动态加载列。
【问题讨论】:
-
DataGrid 通常由行集合表示,其中每一行都有一些列属性。在尝试显示之前,您可能希望将数据转换为基于行的结构。
-
如果您想知道如何显示多个表格,您应该已经知道如何显示单个表格(一个
ColumnSet)并将其包含在您的问题中。否则,您应该首先弄清楚如何显示单个表格,而不必担心许多表格。这个问题的范围很广。 -
我刚刚为问题添加了更多细节。
-
您能否更改您的代码类以使您在 XAML 中使用的名称与代码中的名称匹配?无法真正在代码中的所有
ColumnSets和 xaml 中的{Binding DataTable}、FuzzyInnerTableControl等之间进行转换。 -
我在后面添加了代码。抱歉,我之前忘记了。