Привязка к свойству ObservableCollection объекта в ObservableCollection - PullRequest
0 голосов
/ 18 июня 2019

Я хочу отобразить данные «Столбцы» объекта DataRow в GridView:

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>

Я не понимаю, почему я не могу связать свой ItemsSource из GridView с Data.Columns- ObservableCollection.

Сообщение об ошибке:

Ошибка пути BindingExpression: свойство 'Columns' не найдено в 'object' '' ObservableCollection`1 '(HashCode = 61300126)'. BindingExpression: Path = Data.Columns; DataItem = «Таблица» (HashCode = 50904493); целевой элемент - RadGridView (Name = '); Целевым свойством является «ItemsSource» (тип «Object»)

Помимо отображения данных, таблица должна поддерживать копирование / вставку из Excel и редактирование значений. Поскольку я заранее не знаю, сколько нужно строк и столбцов, я использую динамический объект ExpandoObject, в который я могу добавлять свойства во время выполнения, которые являются моими столбцами в сетке данных.

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Согласно последнему комментарию Килиана, я сгладил источник данных и интегрировал «Столбцы» в свой класс Table.Это работает и приводит к следующей таблице данных:

Отображаемая динамическая таблица

Эта таблица удовлетворяет моему требованию для отображения данных и поддерживает копирование / вставку из Excel.Я также могу редактировать ячейки.Если я сейчас выбираю ячейку этой сетки данных, я знаю, какой столбец выбран, но, к сожалению, мне не хватает информации о строке.Я могу обойти проблему, если каждая ячейка имеет уникальное значение, тогда я могу сделать сравнения, чтобы найти редактируемую в данный момент строку.Но что я мог сделать, если это не так?

0 голосов
/ 18 июня 2019

Объект с именем «Данные» является ObservableCollection DataRow. Как упоминалось в полученной ошибке, этот объект не имеет свойства с именем «Столбцы».
Если вы хотите отображать столбцы для каждого DataRow в Data, вы можете использовать иерархическую сетку, где вы отображаете свойство «Row» и данные Columns в качестве дочерней сетки. Смотри https://docs.telerik.com/devtools/wpf/controls/radgridview/getting-started/building-hierarchical-grid-view

...