【问题标题】:Dynamic DataGrid Columns and Content in XAMLXAML 中的动态 DataGrid 列和内容
【发布时间】:2016-06-11 11:32:15
【问题描述】:

我有以下 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&lt;SecondaryFile&gt; Files { get; set; } = new ObservableCollection&lt;SecondaryFile&gt;();,每个 SecondaryFile 都有一个

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

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

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

欢迎提出任何建议!

谢谢!

【问题讨论】:

    标签: c# wpf xaml data-binding datagrid


    【解决方案1】:

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

    【讨论】:

    • 谢谢!出于某种原因,使用 Path=Files.Table 似乎不起作用。我当前的解决方法是在 FileType 下创建另一个 DataTable,并使用 Merge 合并其中的所有 SecondaryFile 列和数据。使用 Path=Files.Table 时我是否遗漏了什么?我是否应该将 fileTypes 变量绑定到 DataContext 以外的其他东西?
    • 由于我没有您的完整文件,我无法确定是什么问题。尝试更改您的第一行(在示例代码中)ItemsSource="{Binding}" 和您要绑定的“根”对象的名称。如果没记错应该是="{Binding fileTypes}"
    猜你喜欢
    • 1970-01-01
    • 2015-11-19
    • 2021-03-23
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    相关资源
    最近更新 更多