2010-07-14 6 views
5

Bastante nuevo en WPF ...hay una DataTemplate para elementos de panel de rejilla en WPF?

Tengo una colección de datos que me gustaría vincular a un panel de la cuadrícula. Cada objeto contiene su fila y columna de cuadrícula, así como elementos para completar en la ubicación de la cuadrícula. Me gusta mucho cómo puedo crear plantillas de datos en el cuadro de lista XAML para crear una interfaz de usuario sin casi nada en el código subyacente. ¿Hay alguna manera de crear una plantilla de datos para los elementos del panel de la cuadrícula y vincular el panel a una recopilación de datos?

Respuesta

13

puede utilizar un ItemsControl con un Grid como su panel. Aquí hay un ejemplo. XAML:

<ItemsControl x:Name="myItems"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition /> 
         <ColumnDefinition /> 
         <ColumnDefinition /> 
        </Grid.ColumnDefinitions> 
        <Grid.RowDefinitions> 
         <RowDefinition /> 
         <RowDefinition /> 
         <RowDefinition /> 
        </Grid.RowDefinitions> 
       </Grid> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding MyText}" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
     <ItemsControl.ItemContainerStyle> 
      <Style> 
       <Style.Setters> 
        <Setter Property="Grid.Row" Value="{Binding MyRow}" /> 
        <Setter Property="Grid.Column" Value="{Binding MyColumn}" /> 
       </Style.Setters> 
      </Style> 
     </ItemsControl.ItemContainerStyle> 
    </ItemsControl> 

Codebehind (para propósitos de prueba):

public Window1() 
    { 
     InitializeComponent(); 
     myItems.ItemsSource = new[] { 
      new {MyRow = 0, MyColumn = 0, MyText="top left"}, 
      new {MyRow = 1, MyColumn = 1, MyText="middle"}, 
      new {MyRow = 2, MyColumn = 2, MyText="bottom right"} 
     }; 
    } 
+4

Esto funciona muy bien si usted tiene un número conocido de filas que se muestran, pero no le permite mostrar un número arbitrario de filas basado en la cantidad que disponemos de datos. – LJNielsenDk

+1

yo estaba tratando de establecer la fila y columna de la DataTemplate (en el elemento raíz en la plantilla) y se preguntaba por qué no estaba funcionando. Esto ayudó enormemente. ¡Gracias! – qJake

0

No estoy seguro si esto le ayudará, pero ¿por qué no tratas de establecer el ItemsPanel de ItemsControl (ListBox, ListView) a una UniformGrid. Algo como esto:

<ItemsControl> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

Es similar a la solución anterior, solo que un poco más dinámica.

Cuestiones relacionadas