绑定到ObservableCollection中的对象上的ObservableCollection属性

时间:2019-06-18 09:40:58

标签: c# data-binding observablecollection

我想在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,可以在运行时添加属性,这些属性是我在数据网格中的列。

2 个答案:

答案 0 :(得分:0)

称为“数据”的对象是DataRow的ObservableCollection。正如您在错误中提到的那样,该对象没有名为“列”的属性。
如果要显示数据中每个DataRow的列,则可能要使用分层网格,在该网格中显示“行”属性,并将列数据显示为子网格。参见https://docs.telerik.com/devtools/wpf/controls/radgridview/getting-started/building-hierarchical-grid-view

答案 1 :(得分:0)

根据Kilians的最后评论,我拉平了数据源,并在Table类中集成了“列”。这正在工作,并产生以下数据表:

Displayed dynamic table

此表满足我显示数据的要求,并支持从Excel复制/粘贴。我也可以编辑单元格。如果现在选择该数据网格的单元格,则知道选择了哪一列,但不幸的是,我缺少行信息。如果每个单元格都有一个唯一值,则可以绕过该问题,然后可以进行比较以找到当前编辑的行。但是,如果不是这种情况该怎么办?