代码之家  ›  专栏  ›  技术社区  ›  CodeWarrior

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

  •  0
  • CodeWarrior  · 技术社区  · 14 年前

    我有一个包含在CompaniesCollection中的Company对象集合,它继承自Observable集合。通过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中,以尝试访问这些地址,但没有任何效果。如何访问数据绑定的ListBoxItem中的子集合(从而访问该集合中的特定项)?任何帮助都会非常有帮助。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Alex Paven    14 年前

    这取决于保存地址集合的对象属性的外观。但是,既然这样做可能更容易,为什么不简单地向名为firstaddress的公司添加一个属性,并返回getter中集合中的第一个元素呢?然后您可以绑定到firstaddress.city等。当集合为空或与此相关的任何其他内容时,您可以自由返回空值,因此您不仅依赖绑定。