我有一个绑定到DataGrid
的WPF ObservableCollection
。
我的集合中的每个项目都有List<someObject>
的属性。
在我的行详细信息窗格中,我想为此集合中的每个项目写出格式化的文本块。最终结果将等同于:
<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>
等等0-n次。
我已尝试使用ItemsControl
:
<ItemsControl ItemsSource="{Binding Path=Exchanges}">
<DataTemplate>
<Label>test</Label>
</DataTemplate>
</ItemsControl>
但是,这似乎仅适用于更多静态源,因为它会抛出以下异常(集合在创建后不会更改):
使用ItemsSource时,ItemsControl操作无效。使用ItemsControl.ItemsSource访问和修改元素*
还有另一种方法可以达到这个目的吗?
答案 0 :(得分:64)
您在<DataTemplate .../>
内指定ItemsControl
所做的工作是将DataTemplate
的此实例添加到ItemsControl
的默认属性Items
。因此,您获得的异常是预期结果:首先指定ItemsSource
,然后修改Items
。相反,您应该修改ItemTemplate
上的ItemsControl
属性,如下所示:
<ItemsControl ItemsSource="{Binding Path=Exchanges}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Label>test</Label>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>