Привязка к свойству определенного элемента коллекции в ListBoxItemContainerStyle - PullRequest
0 голосов
/ 17 сентября 2010

У меня есть коллекция объектов Company, содержащихся в CompaniesCollection, которая унаследована от Observable Collection.Через CollectionViewSource я отображаю эти компании в списке.Одно из моих требований заключается в том, что в каждом элементе компании должен быть указан город и штат первого адреса (набора адресов), прикрепленного к каждой компании.

Я перепробовал все, что смог, чтобы отобразить эти значения,и я не могу этого сделать.Я проверил, что каждый объект Company действительно имеет по крайней мере один адрес (у большинства есть два или более).

Вот ControlTemplate для ListBoxItemContainer, который я использую для отображения Company:

<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>

Я также попытался загрузить Адреса (и, если на то пошло, Контакты) в CollectionViewSources в ControlTemplate.Resources, чтобы попытаться получить к ним доступ безрезультатно.Как получить доступ к дочерней коллекции (и, следовательно, к определенному элементу в этой коллекции) в DataBound ListBoxItem?Любая помощь будет очень полезна.

1 Ответ

1 голос
/ 18 сентября 2010

Это зависит от того, как выглядит свойство вашего объекта, содержащее коллекцию адресов.Но так как это было бы, возможно, проще, почему бы просто не добавить в свою компанию свойство с именем FirstAddress и вернуть первый элемент в коллекции в получателе?Затем вы можете связываться с FirstAddress.City и т. Д. Вы можете возвращать значение NULL, когда коллекция пуста или что-либо еще по этому вопросу, поэтому вы не зависите только от привязок.

...