且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何在 WPF 中动态创建数据网格?

更新时间:2023-11-12 08:45:28

首先,将尽可能多的不同设置移到可重用的StylesDataTemplates 中,留下DataGrid 本身很少:

First, move as much as possible of the different settings out into reusable Styles and DataTemplates, leaving very little in the DataGrid itself:

<UserControl ... >

    <UserControl.Resources>
        <Style x:Key="GridHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="FontWeight" Value="Bold" />
            <Setter Property="FontSize" Value="12" />
        </Style>

        <Style x:Key="ReadOnlyGridStyle" TargetType="{x:Type DataGrid}" >
            <Setter Property="AutoGenerateColumns" Value="False" />
            <Setter Property="IsReadOnly" Value="True" />
            <Setter Property="GridLinesVisibility" Value="None" />
            <Setter Property="CanUserAddRows" Value="False" />
            <Setter Property="CanUserDeleteRows" Value="False" />
            <Setter Property="CanUserResizeColumns" Value="False" />
            <Setter Property="CanUserResizeRows" Value="False" />
            <Setter Property="CanUserReorderColumns" Value="False" />
            <Setter Property="ColumnHeaderStyle" Value="{StaticResource GridHeaderStyle}" />
        </Style>

        <DataTemplate x:Key="IngredientsCellTemplate" >
            <DataGrid ItemsSource="{Binding Ingredients}" 
                      Style="{StaticResource ReadOnlyGridStyle}" >
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Ingredients" Width="*" FontSize="12"
                                        Binding="{Binding Path=IngredientName}" />
                    <DataGridTextColumn Header="Quantite" Width="*" FontSize="12"
                                        Binding="{Binding Path=Qty}" />
                </DataGrid.Columns>
            </DataGrid>
        </DataTemplate>
    </UserControl.Resources>


    <!-- A DataGrid using our Styles: -->
    <DataGrid ItemsSource="{Binding View}" 
              Style="{StaticResource ReadOnlyGridStyle}" >
        <DataGrid.Columns>
            <DataGridTextColumn Header="Type" Width="200" FontSize="12"
                                Binding="{Binding Path=Name}" />
            <DataGridTemplateColumn Header="Ingredients" Width="*"
                                    CellTemplate="{StaticResource IngredientsCellTemplate}" />
        </DataGrid.Columns>
    </DataGrid>

</UserControl>

然后使用现有样式在代码隐藏中创建新的 DataGrid 变得容易得多:

Then it gets a lot easier to create new DataGrids in your code-behind, using the existing Styles:

var datagrid = new DataGrid();
datagrid.Style = FindResource("ReadOnlyGridStyle") as Style;

datagrid.Columns.Add(new DataGridTextColumn()
{
    Header = "Type",
    Width = new DataGridLength(200),
    FontSize = 12,
    Binding = new Binding("Name")
});
datagrid.Columns.Add(new DataGridTemplateColumn()
{
    Header = "Ingredients",
    Width = new DataGridLength(1, DataGridLengthUnitType.Star),
    CellTemplate = FindResource("IngredientsCellTemplate") as DataTemplate
});

datagrid.ItemsSource = ...