【发布时间】:2017-04-12 15:04:10
【问题描述】:
我已经使用数据表构建了一个数据网格,结果显示正确。
现在我打算将 ROWHEADERs 添加到数据网格中。我填充了一个observable collection<string>,在XAML 中,我将其用作行标题数据模板路径。尽管如此,它仍然没有出现。有人可以建议问题出在哪里吗?
public ObservableCollection<string> Rownameheaders { get; set; } //in the main .cs
//xaml.cs
public void Form1_load(object sender, EventArgs e)
{
WF_CRM_RPluginModel model = DataContext as WF_CRM_RPluginModel;
var hello1 = new ObservableCollection<String>();
for(int i=0; i< model.prodwells.Count;i++)
{
hello1.Add(model.prodwells[i]);
}
model.Rownameheaders = hello1;
List<double[]> list = new List<double[]>();
for (int i = 0; i < model.RowFijtable; i++)
{
double[] rowdata = new double[model.ColFijtable];
for (int j = 0; j < model.ColFijtable; j++)
{
rowdata[j] = model.TauTable[i, j];
}
list.Add(rowdata);
}
DataTable table = ConvertListToDataTable(list);
dataGridView1.ItemsSource = table.AsDataView();
}
private DataTable ConvertListToDataTable(List<double[]> list)
{
DataTable table = new DataTable();
WF_CRM_RPluginModel model = DataContext as WF_CRM_RPluginModel;
// Get max columns.
int columns = 0;
foreach (var array in list)
{
if (array.Length > columns)
{
columns = array.Length;
}
}
// Add columns.
for (int i = 0; i < columns; i++)
{
// Provide default column name & data type
table.Columns.Add(model.injwells[i], typeof(double));
}
// Add rows.
foreach (var array in list)
{
// assign each array element to the appropriate column
var row = table.NewRow();
for (int i = 0; i < array.Length; ++i)
row.SetField(i, array[i]);
table.Rows.Add(row);
}
return table;
}
XAML:
<DataGrid Name="dataGridView1" Loaded="Form1_load" ItemsSource="{Binding}" AutoGenerateColumns="True" AlternatingRowBackground="Gainsboro" CanUserSortColumns="False">
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}, Path=Rownameheaders}"/>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
</DataGrid>
这是我得到的结果,但没有行标题...
【问题讨论】:
-
你的绑定寻找
DataGridRow类型的视觉祖先,如果找到,它绑定到DataGridRow.Rownameheaders。但是DataGridRow没有该名称的属性。试试Path=DataContext.Rownameheaders[0]——我想这会让你得到第一个行名标题。您的下一个问题是如何使其从该集合中为每一行获取正确的项目。我猜是某种多值转换器,它绑定到 Rownameheaders 以及它会从中获取索引的东西。 -
也许您最好的选择是将 RowHeader 列添加到您的 DataTable 并绑定到该列。或者使用 POCO 类的集合而不是 DataTable,并为 POCO 类提供将用作行标题的属性。
-
感谢@EdPlunkett!我最终添加了一个新列。请看答案!
标签: c# wpf xaml datagrid observablecollection