XAML 中的动态数据网格列和内容

本文关键字:网格 数据网 动态 数据 XAML | 更新日期: 2023-09-27 18:36:31

我有以下 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,与"文件类型"类相关联。每个文件类型类都有一个public ObservableCollection<SecondaryFile> Files { get; set; } = new ObservableCollection<SecondaryFile>();,每个辅助文件都有

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

是否可以通过 XAML 将列和数据绑定到网格?请记住,TabItems 和匹配的数据网格本身是动态的,列数及其内容也是如此。

我尝试以动态方式为网格命名,以便能够以编程方式访问它,但无济于事。

任何建议将非常受欢迎!

谢谢!

XAML 中的动态数据网格列和内容

如果我理解正确,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"/>