2016-02-28 3 views
1

У меня есть следующий код XAML:Динамические столбцы DataGrid и содержание в XAML

<TabControl Grid.Row="1" x:Name="tabs" ItemsSource="{Binding}"> 
    <TabControl.ItemContainerStyle> 
     <Style TargetType="{x:Type TabItem}"> 
      <Setter Property="Header" Value="{Binding Name}" /> 
      <Setter Property="Visibility" Value="{Binding Visibility}" /> 
     </Style> 
    </TabControl.ItemContainerStyle> 
    <TabControl.ContentTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="Auto" /> 
        <RowDefinition Height="1*" /> 
       </Grid.RowDefinitions> 
       <WrapPanel Grid.Row="0"> 
        <ComboBox VerticalAlignment="Center" HorizontalAlignment="Left" Width="100" ItemTemplate="{StaticResource  CCCItemTemplate}" ItemsSource="{Binding Subtypes}" /> 
        <ComboBox VerticalAlignment="Center" HorizontalAlignment="Left" Width="100" ItemTemplate="{StaticResource CCCFileItemTemplate}" ItemsSource="{Binding Files}" /> 
       </WrapPanel> 
       <DataGrid Grid.Row="1" ItemsSource="{Binding Path=Files}" /> 
      </Grid> 
     </DataTemplate> 
    </TabControl.ContentTemplate> 
</TabControl> 

Где вкладки сами добавляются динамически через XAML с tabs.DataContext = fileTypes;. Каждая вкладка имеет собственный DataGrid, связанный с классом «FileType». Каждый класс FileType имеет public ObservableCollection<SecondaryFile> Files { get; set; } = new ObservableCollection<SecondaryFile>();, и каждый имеет SecondaryFile

public ArrayList Columns { get; set; } = new ArrayList(); 
... 
public string[][] data { get; set; }; 

Есть в любом случае, чтобы связать столбцы и данные в сетке с помощью XAML? Имейте в виду, что TabItems и соответствующие DataGrids являются динамическими сами собой, равно как и количество столбцов и их содержимое.

Я попытался дать ребрам имя динамически, поэтому я могу получить доступ к нему программно, но безрезультатно.

Любые предложения были бы более чем приветствуются!

Спасибо!

ответ

2

Если я правильно понимаю SecondaryFile содержит эти два поля, где Columns крепят headers вашего DataGrid и data держит строки.

Если это так, и вы хотите заполнить DataGrid этими двумя динамически, используя только код xaml, я предлагаю использовать DataTable. Для этого вам нужно опустить как Columns, так и data и использовать один объект DataTable insted, который позже вы свяжете как ItemSource с DataGrid. Кроме того, вам необходимо установить DataGridAutoGenerateColumns на True.

Чтобы создать свою таблицу данных

public DataTable table { get; set; } 

// Here we create a DataTable 
table = new DataTable(); 

table.Columns.Add("Col1", typeof(int)); 
table.Columns.Add("Col2", typeof(string)); 
table.Columns.Add("Col3", typeof(string));  

// Here we add DataRows. 
table.Rows.Add(1, "john", "doe"); 
table.Rows.Add(2, "jane", "doe"); 

И в XAML у вас будет что-то вроде

<DataGrid Grid.Row="1" ItemsSource="{Binding Path=Files.table}" AutoGenerateColumns="True"/> 
+0

Спасибо! По какой-то причине использование Path = Files.Table не работает. Моим текущим решением является создание другого DataTable под FileType и использование Merge для объединения всех столбцов и данных SecondaryFile в нем. Я что-то пропускаю при использовании Path = Files.Table? Должен ли я привязать переменную fileTypes к чему-то, кроме DataContext? – hyit

+0

Поскольку у меня нет ваших полных файлов, я не могу точно сказать, в чем проблема. Попытайтесь изменить свою первую строку (в примере кода) 'ItemsSource =" {Binding} "' и имя объекта 'root', который вы связываете. Если не ошибаюсь, это должно быть '=" {Binding fileTypes} "'. – Athafoud

Смежные вопросы