2010-06-09 7 views
26

Tengo un WPF DataGrid vinculado a ObservableCollection. Cada elemento en mi colección tiene propiedad que es un List<someObject>. En el panel de detalles de mi fila, me gustaría escribir bloques de texto formateados para cada elemento de esta colección. El resultado final sería algo equivalente a:WPF Repeater (como) control para la fuente de recolección?

<TextBlock Style="{StaticResource NBBOTextBlockStyle}" HorizontalAlignment="Right"> 
<TextBlock.Inlines> 
    <Run FontWeight="Bold" Text="{Binding Path=Exchanges[0].Name}" /> 
    <Run FontWeight="Bold" Text="{Binding Path=Exchanges[0].Price}" /> 
    <LineBreak /> 
    <Run Foreground="LightGray" Text="{Binding Path=Exchanges[0].Quantity}" /> 
</TextBlock.Inlines> 
</TextBlock> 
<TextBlock Style="{StaticResource NBBOTextBlockStyle}"> 
<TextBlock.Inlines> 
    <Run FontWeight="Bold" Text="{Binding Path=Exchanges[1].Name}" /> 
    <Run FontWeight="Bold" Text="{Binding Path=Exchanges[1].Price}" /> 
    <LineBreak /> 
    <Run Foreground="LightGray" Text="{Binding Path=Exchanges[1].Quantity}" /> 
</TextBlock.Inlines> 
</TextBlock> 

y así sucesivamente 0-n veces.

He intentado usar ItemsControl para esto: sin embargo

<ItemsControl ItemsSource="{Binding Path=Exchanges}"> 
    <DataTemplate> 
     <Label>test</Label> 
    </DataTemplate> 
</ItemsControl> 

, esto parece ser sólo significó para las fuentes más estáticas, ya que desencadena la siguiente excepción (colección no se altera después de la creación):

ItemsControl La operación no es válida mientras ItemsSource está en uso. Acceda y modifique elementos con ItemsControl.ItemsSource en su lugar *

¿Hay alguna otra forma de lograr esto?

+0

El ItemsControl debe estar bien. Por lo general, obtiene este error al utilizar la propiedad Items de ItemsControl mientras su ItemsSource está vinculado, ¿podría ser ese el caso? –

Respuesta

60

Lo que hizo especificando <DataTemplate .../> interior de ItemsControl es que ha añadido esta instancia de DataTemplate por defecto propiedad de ItemsControl que es Items. Entonces, la excepción que obtuvo es el resultado esperado: primero especifica el ItemsSource, luego modifica Items. En su lugar debe modificar ItemTemplate propiedad en su ItemsControl así:

<ItemsControl ItemsSource="{Binding Path=Exchanges}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Label>test</Label> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 
+0

increíble, gracias. De todos modos, ¿puedo hacer que los artículos en esa plantilla se apilen horizontalmente en lugar de verticalmente? –

+1

Cambie el Panel de elementos para usar una Plantilla de Panel de elementos con un Panel de pila que tenga Orientación = "Horizontal". –

+1

Editar: muestra agregada 'ItemPanelTemplate' sugerida por John. Puede usar 'WrapPanel' en lugar de' StackPanel', si desea el ajuste de línea. – repka

Cuestiones relacionadas