绑定到ListBoxItemContainerStyle中特定集合项的属性

时间:2010-09-17 15:19:57

标签: wpf data-binding collections listboxitem

我有一个CompanyCollection中包含的Company对象集合,它继承自Observable Collection。通过CollectionViewSource,我在列表框中显示这些公司。我的要求之一是每个公司项目必须显示附属于每个公司的第一个地址(地址集合)的城市和州。

我已经尝试了所有我能想到的东西来展示这些价值观,我似乎无法做到。我已经验证每个公司对象确实至少有一个地址(大多数有两个或更多)。

这是我用来显示公司的ListBoxItemContainer的ControlTemplate:

<ControlTemplate TargetType="{x:Type ListBoxItem}">
    <Grid Height="Auto" Width="Auto" DataContext="{Binding Source={StaticResource CompanyDataSource}}">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Border x:Name="Bd" BorderThickness="{TemplateBinding BorderThickness}" Background="#59000000" SnapsToDevicePixels="true" CornerRadius="10" Padding="3,1" d:LayoutOverrides="Width, Height" Grid.RowSpan="1">
            <Grid Height="Auto" Width="Auto" Margin="3,1">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" MinWidth="70"/>
                    <ColumnDefinition Width="*" MinWidth="30"/>
                    <ColumnDefinition Width="20" MinWidth="30"/>
                </Grid.ColumnDefinitions>
                <TextBlock TextWrapping="Wrap" Text="{Binding CompanyName}" Style="{DynamicResource TitleText}" Margin="0" VerticalAlignment="Top" d:LayoutOverrides="Width" Grid.ColumnSpan="2"/>
                <Grid Margin="0" Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Top">
                    <Ellipse Fill="#FFAB1D1D" HorizontalAlignment="Left" Height="13" Stroke="#FFDE5B5B" VerticalAlignment="Top" Width="13"/>
                </Grid>
                <Grid Grid.Column="1" Grid.Row="1">
                    <Grid Grid.Column="0" Grid.Row="0">
                        <TextBlock Margin="0" TextWrapping="Wrap" Text="{Binding Addresses[0].City}" d:LayoutOverrides="Width, Height" Grid.Column="0" Grid.Row="0" Style="{DynamicResource SubtitleText}"/>
                    </Grid>
                </Grid>
                <TextBlock Margin="0" TextWrapping="Wrap" Text="{Binding CompanyName2}" d:LayoutOverrides="Width, Height" Grid.Row="1" Style="{DynamicResource SubtitleText}"/>
            </Grid>
        </Border>
        <Border BorderThickness="0" Grid.ColumnSpan="1" Grid.RowSpan="1" Margin="7,0" Grid.Row="1" CornerRadius="0,0,10,10" Background="#4CFFFFFF">
            <ListBox Background="#00000000" ItemTemplate="{DynamicResource ContactTemplate}" ItemsSource="{Binding Contacts}"/>
        </Border>
    </Grid>
</ControlTemplate>

我还尝试将地址(以及与此有关的联系人)加载到ControlTemplate.Resources中的CollectionViewSources中,以尝试访问它们无济于事。如何在DataBound ListBoxItem中访问子集合(从而访问该集合中的特定项)?任何帮助都会非常有用。

1 个答案:

答案 0 :(得分:1)

这取决于保存地址集合的对象属性是什么样的。但是,因为它可以说更容易,为什么不简单地向公司添加名为FirstAddress的属性并返回getter中集合中的第一个元素?然后你可以绑定到FirstAddress.City等。当集合为空或其他任何东西时,你可以自由地返回null,因此你不仅仅依赖于绑定。