WPF ContentPresenter показывает только первый элемент в списке - PullRequest
1 голос
/ 05 октября 2011

Я пытаюсь создать приложение WPF, в котором у меня есть StackPanel, которая показывает список учетных записей.В коде для каждой учетной записи есть объект Account, хранящийся в структуре List.Я хочу связать это с моим WPF, но не хочу списка.

Вместо этого я определил шаблон для отображения каждой сводки учетной записи.Затем я хочу сложить их в StackPanel и вызвать его на день.

Проблема в том, что привязка данных берет только первый элемент из списка и все.Как связать это так, чтобы это эффективно создавало небольшой набор хорошо отформатированных кусков данных?

Вот соответствующий код WPF:

<StackPanel Name="sp_AccountList" Margin="0,0,0,0" VerticalAlignment="Top">
    <StackPanel.Resources>
    <svc:AccountBalanceColorConverter x:Key="accountColorConverter" />
    <Style x:Key="AccountSummaryBackgroundGradient" TargetType="{x:Type StackPanel}">
    <!-- nice formatting code here -->
    </Style>
    <Style x:Key="AccountSummaryNameStyle" TargetType="{x:Type TextBlock}">
        <Setter Property="Padding" Value="10,0,0,0" />
        <Setter Property="FontSize" Value="18" />
        <Setter Property="Height" Value="20" />
        <Setter Property="FontFamily" Value="Cambria" />
        <Setter Property="Foreground" Value="White" />
        <Setter Property="Background" Value="Transparent" />
    </Style>
    <Style x:Key="AccountSummaryBalanceStyle" TargetType="{x:Type TextBlock}">
        <Setter Property="Padding" Value="10,0,0,0" />
        <Setter Property="FontSize" Value="14" />
        <Setter Property="Height" Value="20" />
        <Setter Property="FontFamily" Value="Cambria" />
        <Setter Property="Background" Value="Transparent" />
    </Style>                    
    <ObjectDataProvider x:Key="accounts"
                        ObjectType="{x:Type svc:AccountService}"
                        MethodName="ListAccounts" />
    <DataTemplate x:Key="AccountSummaryLayout">
    <StackPanel Orientation="Vertical" Style="{StaticResource AccountSummaryBackgroundGradient}">
        <TextBlock Text="{Binding Path=Name}" Style="{StaticResource AccountSummaryNameStyle}" />
        <StackPanel Orientation="Horizontal">
            <TextBlock Foreground="{Binding Path=TotalAccountBalance, Converter={StaticResource accountColorConverter} }" Text="{Binding Path=TotalAccountBalance, Mode=OneWay}" Style="{StaticResource AccountSummaryBalanceStyle}" />
            <TextBlock Foreground="{Binding Path=AvailableAccountBalance, Converter={StaticResource accountColorConverter} }" Text="{Binding Path=AvailableAccountBalance, Mode=OneWay}" Style="{StaticResource AccountSummaryBalanceStyle}" />
        </StackPanel>
    </StackPanel>
    </DataTemplate>
    </StackPanel.Resources>
    <StackPanel Orientation="Vertical">
        <ContentPresenter x:Name="AccountSummaryPresenter" ContentTemplate="{StaticResource AccountSummaryLayout}" Content="{DynamicResource accounts}" />
    </StackPanel>
</StackPanel>

1 Ответ

5 голосов
/ 05 октября 2011

StackPanel не имеет свойства ItemsSource, его дочерние элементы управления не могут быть привязаны к данным.

То, что вы можете сделать, это создать ItemsControl, который использует StackPanel в качестве Itemhost.

     <ScrollViewer>
            <ItemsControl ItemsSource="{Binding Source={StaticResource accounts}}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel IsItemsHost="True" Orientation="Vertical" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                ...
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        <ScrollViewer>
...