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 和匹配的数据网格本身是动态的,列数及其内容也是如此。
我尝试以动态方式为网格命名,以便能够以编程方式访问它,但无济于事。
任何建议将非常受欢迎!
谢谢!
如果我理解正确,SecondaryFile
包含这两个字段,其中Columns
保存 DataGrid 的headers
,data
保存行。
如果是这种情况,并且您希望仅使用 xaml 代码动态地用这两个来填充 DataGrid,我建议使用 DataTable。为此,您必须省略Columns
和data
,而是使用单个 DataTable 对象,稍后将作为ItemSource
绑定到DataGrid
。此外,您需要将DataGrid
的AutoGenerateColumns
属性设置为 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"/>