2013-04-20 2 views
2

У меня есть следующие DataGrid в XAML:Как динамически создавать datagrid в 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> 

Я пытаюсь найти способ, чтобы создать DataGrid динамически (в-коде), так что я могу создать несколько копий этого и привязать его к различным источникам данных в время выполнения.

Возможно ли это? Кто-нибудь знает, как я мог бы это сделать, потому что такой набор данных был сложным?

+0

Зачем вам нужны копии копий данных? Просто измените dataSource во время выполнения – makc

+0

Мне нужно показать MANY grid – JSchwartz

+0

@JScwartz - это количество сеток, определенных во время выполнения пользователем? или его просто много сеток, но число const? – makc

ответ

6

Во-первых, двигаться как можно больше различных настроек из в многоразовой Styles и DataTemplates, оставляя очень мало в самом 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> 

Затем он получает намного проще создавать новые DataGrids в коде - используя существующие стили:

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 "), так как это порождает ошибку компиляции: Ошибка Невозможно найти имя или имя пространства имен« Связывание »(вы не указали директиву использования или ссылку на сборку?) – JSchwartz

+0

На самом верху в вашем файле кода вы должны см. несколько строк: «using System ...». Добавьте эту строку в этот список: 'using System.Windows.Data;' – Sphinxxx