2010-06-09 5 views
26

Ich habe eine WPF DataGrid gebunden an ObservableCollection. Jedes Objekt in meiner Sammlung hat eine Eigenschaft, die eine List<someObject> ist. In meinem Zeilen-Detailfenster möchte ich für jedes Element in dieser Sammlung formatierte Textblöcke schreiben. Das Endergebnis wäre etwas wie:WPF Repeater (like) Kontrolle für Sammelquelle?

<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> 

und so weiter 0-n mal.

Ich habe versucht mit ItemsControl dafür:

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

jedoch scheint dies nur für mehr statische Quellen gedacht werden, wie es die folgende Ausnahme auslöst (Sammlung wird nach der Erstellung nicht verändert):

ItemsControl Operation ist nicht gültig, während ItemsSource verwendet wird. Auf Elemente mit ItemsControl.ItemsSource zugreifen und sie ändern *

Gibt es eine andere Möglichkeit, dies zu erreichen?

+0

Die Items sollten in Ordnung sein. Dieser Fehler tritt normalerweise auf, wenn Sie die Items-Eigenschaft von ItemsControl verwenden, während Ihre ItemsSource gebunden ist. Könnte dies der Fall sein? –

Antwort

60

Was Sie tat <DataTemplate .../> innerhalb von ItemsControl spezifiziert ist, dass Sie diese Instanz von DataTemplate hinzugefügt Eigenschaft ItemsControl auf Standard die Items ist. Die Ausnahme ist also das erwartete Ergebnis: Zuerst geben Sie ItemsSource an, dann ändern Sie Items. Stattdessen sollten Sie ItemTemplate Eigentum auf Ihrem ItemsControl wie so ändern:

<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

genial, danke. Wie auch immer, ich kann die Elemente in dieser Vorlage horizontal anstatt vertikal aufstellen? –

+1

Ändern Sie das ItemsPanel, um ein ItemsPanelTemplate mit einem StackPanel zu verwenden, das Orientation = "Horizontal" hat. –

+1

Edit: Beispiel "ItemPanelTemplate" hinzugefügt von John hinzugefügt. Sie können 'WrapPanel' anstelle von' StackPanel' verwenden, wenn Sie Zeilenumbruch wünschen. – repka