ComboBox с двумя столбцами во всплывающем окне - PullRequest
2 голосов
/ 19 марта 2012

Мне нужно создать пользовательский элемент управления, содержащий поле со списком, всплывающее окно которого будет иметь свойство Name связанных объектов, выровненных по левому краю, и свойство CreatedDate связанных объектов, выровненных по правому краю в каждом всплывающем элементе.Также Имя и CreatedDate не должны перекрываться.Имя объекта имеет переменную длину

Я пытался решить эту проблему, используя DataTemplate в Combobox.ItemTemplate, внутри шаблона данных у меня есть сетка с двумя столбцами, выровненными соответствующим образом.Горизонтальное выравнивание Сетки установлено на Растянуть, но по какой-то причине Сетка не заполняет доступное пространство во всплывающем окне.Кто-нибудь знает, как это обойти и почему это происходит?Я использую WPF 3.5.

<UserControl.Resources>
    <CollectionViewSource x:Key="cvsProcessingSessionList" Source="{Binding ProcessingSessionList, ElementName=View}"/>
    <Style TargetType="{x:Type ComboBox}"
           BasedOn="{StaticResource {x:Static res:ObjectResources.LEComboBoxStyle}}">
        <Setter Property="Margin" Value="5,3"/>
        <Setter Property="HorizontalAlignment" Value="Stretch"/>
        <Setter Property="VerticalAlignment" Value="Center"/>            
    </Style>
</UserControl.Resources>

<GroupBox x:Name="grbProcessingSession">
    <GroupBox.Header>
        <Bold>Processing Session:</Bold>
    </GroupBox.Header>
    <GroupBox.Content>
        <ComboBox 
                  x:Name="ccbProcessingSessionName"
                  ItemsSource="{Binding Source={StaticResource cvsProcessingSessionList}}" 
                  Loaded="OnLoaded" TextSearch.TextPath="Name"
                  IsEditable="True" MaxDropDownHeight="500" >
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <Grid Background="Pink" HorizontalAlignment="Stretch" >
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="100" />
                        </Grid.ColumnDefinitions>

                        <TextBlock Grid.Column="0" TextAlignment="Left" HorizontalAlignment="Left" 
                                   Margin="0,0,5,0" Text="{Binding Name}"/>
                        <TextBlock  Grid.Column="1" TextAlignment="Right" HorizontalAlignment="Right" 
                                    Text="{Binding CreatedDate, StringFormat=dd/MM/yyyy}"/>
                    </Grid>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
    </GroupBox.Content>
</GroupBox>

Ответы [ 3 ]

4 голосов
/ 19 марта 2012

Просто добавьте эту привязку к вашей сетке через год DataTemplate ...

    Width="{Binding ActualWidth,
                    RelativeSource={RelativeSource FindAncestor,
                            AncestorType={x:Type ComboBoxItem}},
                    Mode=OneTime}"

Также для лучшего эффекта примените цвет фона к ComboBoxItem, а не к сетке ...

 <ComboBox.ItemContainerStyle>
      <Style TargetType="{x:Type ComboBoxItem}">
           <Setter Property="Background" Value="Pink"/>
      </Style>
 </ComboBox.ItemContainerStyle>
1 голос
/ 19 марта 2012

Всякий раз, когда я хочу сделать то же самое, что вы просите, я добавляю:

<ComboBox ...>
         <ComboBoxItem HorizontalContentAlignment="Stretch">
         </ComboBoxItem>
</ComboBox> 

Дело в том, что я помещаю свой собственный DataTemplate внутри ComboBoxItem. Может тебе стоит попробовать ...

0 голосов
/ 20 апреля 2014

На самом деле, лучший способ - установить HorizontalContentAlignment="Stretch" на уровне ComboBox.Это будет работать, даже если ширина ComboBox изменится (например, если он находится в контейнере с изменяемым размером).

Однако учтите, что это работает в WPF и Silverlight 5, но не работает в некоторых старых версиях Silverlight.

...