Подтвердить что ты не робот

WPF Repeater (например) для источника сбора?

У меня есть WPF DataGrid, связанный с 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>

однако, это, по-видимому, предназначено только для более статических источников, поскольку оно генерирует следующее исключение (коллекция не изменяется после создания):

Элементы ItemsControl недействительны при использовании ItemsSource. Доступ и изменение элементов с помощью ItemsControl.ItemsSource вместо *

Есть ли другой способ достичь этого?

4b9b3361

Ответ 1

Что вы сделали, указав <DataTemplate .../> внутри ItemsControl, вы добавили этот экземпляр DataTemplate к свойству default 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>