XAML中的动态DataGrid列和内容

时间:2016-02-28 12:17:52

标签: c# wpf xaml data-binding 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>

使用tabs.DataContext = fileTypes;通过XAML动态添加标签本身的位置。 每个标签都有自己的DataGrid,与&#34; FileType&#34;相关联。类。 每个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本身是动态的,列数及其内容也是如此。

我尝试以动态方式为网格命名,因此我可以通过编程方式访问它,但无济于事。

任何建议都非常受欢迎!

谢谢!

1 个答案:

答案 0 :(得分:2)

如果我理解正确SecondaryFile包含这两个字段,其中Columns包含DataGrid的headersdata包含行。

如果是这种情况,并且您希望仅使用xaml代码使用这两个动态填充DataGrid,我建议使用DataTable。为此,您必须省略Columnsdata,并使用单个DataTable对象,稍后您将ItemSource绑定到DataGrid。此外,您需要将DataGrid的{​​{1}}属性设置为AutoGenerateColumns

创建数据表

True

在xaml中你会有类似

的东西
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");