我想在GridView中显示对象DataRow的“列”数据:
public class DataRow
{
public string Row { get; set; }
public ObservableCollection<IDictionary<string, object>> Columns { get; set; }
public DataRow(string row, ExpandoObject columnData)
{
this.Row = row;
this.Columns = new ObservableCollection<IDictionary<string, object>>() { columnData as IDictionary<string,object>};
}
}
我所有的DataRow对象都收集在另一个类的ObservableCollection中:
public class Table
{
public string DataTableName{ get; set; }
public ObservableCollection<DataRow> Data{ get; set; }
}
我所有的表都包含在另一个类的ObservableCollection中:
public class MyTables
{
public ObservableCollection<Table> MyTables{ get; set; }
}
因此,我尝试通过以下方式进行绑定:
<ItemsControl ItemsSource="{Binding MyTables}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
...
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
...
</Grid.ColumnDefinitions>
<Label ...Text="{Binding DataTableName}"/>
<telerik:RadGridView
...
AutoGenerateColumns="True"
ItemsSource="{Binding Data.Columns}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我不明白为什么我无法将GridView的ItemsSource绑定到Data.Columns- ObservableCollection。
错误消息:
BindingExpression路径错误:在'object''ObservableCollection`1'(HashCode = 61300126)'上找不到'Columns'属性。 BindingExpression:Path = Data.Columns; DataItem ='Table'(HashCode = 50904493);目标元素是'RadGridView'(Name ='');目标属性为“ ItemsSource”(类型为“对象”)
除了仅显示数据外,该表还应支持从Excel复制/粘贴以及值的编辑。因为我事先不知道需要多少行和列,所以我使用的是动态ExpandoObject,可以在运行时添加属性,这些属性是我在数据网格中的列。
答案 0 :(得分:0)
称为“数据”的对象是DataRow的ObservableCollection。正如您在错误中提到的那样,该对象没有名为“列”的属性。
如果要显示数据中每个DataRow的列,则可能要使用分层网格,在该网格中显示“行”属性,并将列数据显示为子网格。参见https://docs.telerik.com/devtools/wpf/controls/radgridview/getting-started/building-hierarchical-grid-view
答案 1 :(得分:0)
根据Kilians的最后评论,我拉平了数据源,并在Table类中集成了“列”。这正在工作,并产生以下数据表:
此表满足我显示数据的要求,并支持从Excel复制/粘贴。我也可以编辑单元格。如果现在选择该数据网格的单元格,则知道选择了哪一列,但不幸的是,我缺少行信息。如果每个单元格都有一个唯一值,则可以绕过该问题,然后可以进行比较以找到当前编辑的行。但是,如果不是这种情况该怎么办?