2016-02-28 72 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」類關聯。 每個文件類型類有一個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握着你的DataGrid的headersdata持有行。

如果是這種情況,並且您希望僅使用xaml代碼動態填充這兩個DataGrid,則我建議使用DataTable。爲此,您必須省略Columnsdata並使用一個單獨的DataTable對象,稍後您將其作爲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似乎不起作用。我當前的解決方法是在FileType下創建另一個DataTable,並使用Merge合併所有SecondaryFile的列和其中的數據。 我在使用Path = Files.Table時丟失了什麼?我應該,也許,將fileTypes變量綁定到DataContext以外的東西? – hyit

+0

由於我沒有你的完整文件,我不能肯定地說出了什麼問題。試着改變你的第一行(在考試代碼中)'ItemsSource =「{Binding}」'和你綁定的'root'對象的名字。如果沒有錯誤,應該是'=「{Binding fileTypes}」'。 – Athafoud