Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF Repeater (like) control for collection source?

Tags:

c#

.net

wpf

I have a WPF DataGrid bound to ObservableCollection. Each item in my collection has Property which is a List<someObject>. In my row details pane, I would like to write out formatted text blocks for each item in this collection. The end result would be something equivalent to:

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

and so on 0-n times.

I've tried using ItemsControl for this:

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

however, this appears to be only meant for more static sources, as it throws the following exception (collection is not altered after creation):

ItemsControl Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead*

Is there another way to achieve this?

like image 812
Sonic Soul Avatar asked Jun 09 '10 21:06

Sonic Soul


1 Answers

What you did by specifying <DataTemplate .../> inside of ItemsControl is you added this instance of DataTemplate to default property of ItemsControl which is Items. So the exception you got is the expected result: first you specify the ItemsSource, then you modify Items. Instead you should modify ItemTemplate property on your ItemsControl like so:

<ItemsControl ItemsSource="{Binding Path=Exchanges}">     <ItemsControl.ItemTemplate>         <DataTemplate>             <Label>test</Label>         </DataTemplate>     </ItemsControl.ItemTemplate>     <ItemsControl.ItemsPanel>         <ItemsPanelTemplate>             <StackPanel Orientation="Horizontal"/>         </ItemsPanelTemplate>     </ItemsControl.ItemsPanel> </ItemsControl> 
like image 144
repka Avatar answered Sep 21 '22 12:09

repka