WPF Repeater(like)控制收集源?

时间:2010-06-09 21:35:22

标签: c# .net wpf

我有一个绑定到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访问和修改元素*

还有另一种方法可以达到这个目的吗?

1 个答案:

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