WPF Repeater (как) управления источником коллекции? - PullRequest
30 голосов
/ 10 июня 2010

У меня есть 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 *

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

1 Ответ

64 голосов
/ 10 июня 2010

Что вы сделали, указав <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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...