2013-04-20 37 views
2

我在XAML以下数据网格:如何在WPF中动态创建数据网格?

<DataGrid ItemsSource="{Binding View}" AutoGenerateColumns="False" IsReadOnly="True" 
      GridLinesVisibility="None" CanUserAddRows="False" CanUserDeleteRows="False" 
      CanUserResizeColumns="False" CanUserResizeRows="False" 
      CanUserReorderColumns="False" > 
    <DataGrid.ColumnHeaderStyle> 
     <Style TargetType="{x:Type DataGridColumnHeader}"> 
      <Setter Property="FontWeight" Value="Bold" /> 
      <Setter Property="FontSize" Value="12" /> 
     </Style> 
    </DataGrid.ColumnHeaderStyle> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Type" Width="200" FontSize="12" 
          Binding="{Binding Path=Name}" /> 
     <DataGridTemplateColumn Header="Ingredients" Width="*"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <DataGrid ItemsSource="{Binding Ingredients}" 
          AutoGenerateColumns="False" IsReadOnly="True" 
          GridLinesVisibility="None" CanUserAddRows="False" 
          CanUserDeleteRows="False" CanUserResizeColumns="False" 
          CanUserResizeRows="False" CanUserReorderColumns="False" > 
         <DataGrid.ColumnHeaderStyle> 
          <Style TargetType="{x:Type DataGridColumnHeader}"> 
           <Setter Property="FontWeight" Value="Bold" /> 
           <Setter Property="FontSize" Value="12" /> 
          </Style> 
         </DataGrid.ColumnHeaderStyle> 
         <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> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

我试图找到一种方法来动态创建数据网格(以代码),这样我可以创建多个副本,并将其绑定到不同的数据源运行。

这可能吗?任何人都知道我可以如何处理这样一个复杂的数据网格?

+0

为什么要创建数据网格的副本?只需在运行时更改数据源 – makc 2013-04-20 12:01:30

+0

我需要显示多个网格 – JSchwartz 2013-04-20 16:16:20

+0

@JScwartz是用户操作在运行时决定的网格数量?或者它只是很多的网格,但常数? – makc 2013-04-21 05:43:34

回答

6

首先,尽可能的不同设置搬出成可重用的StylesDataTemplates,留下很少在DataGrid本身:

<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 - 使用现有的样式:

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 = ... 
+0

我遇到了问题与行Binding = new Binding(“Name “),因为这是生成编译错误:错误无法找到类型或命名空间名称'绑定'(您是否缺少using指令或程序集引用?) – JSchwartz 2013-04-25 06:09:25

+0

在代码文件的最顶部,您应该看到这样的几行:'using System ...'。将这一行添加到该列表中:'using System.Windows.Data;' – Sphinxxx 2013-04-25 14:28:37