弹出窗口中有两列的ComboBox

时间:2012-03-19 07:09:45

标签: wpf wpf-controls

我需要创建一个包含组合框的自定义控件,其弹出窗口将左边对齐的绑定对象的Name propeprty,以及每个弹出项目中右边对齐的绑定对象的CreatedDate属性。 Name和CreatedDate也不能重叠。对象的名称长度可变

我尝试使用Combobox.ItemTemplate中的DataTemplate解决这个问题,在数据模板中我有一个网格,两列适当对齐。 Grid的水平对齐设置为Stretch但由于某种原因Grid不会填充弹出窗口中的可用空间。有谁知道如何解决这个问题以及它为什么会发生?我使用的是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 个答案:

答案 0 :(得分:4)

只需将此约束添加到DataTemplate ...

中的网格即可
    Width="{Binding ActualWidth,
                    RelativeSource={RelativeSource FindAncestor,
                            AncestorType={x:Type ComboBoxItem}},
                    Mode=OneTime}"

另外,为了获得更好的效果,请将背景颜色应用于组合框项而不是网格...

 <ComboBox.ItemContainerStyle>
      <Style TargetType="{x:Type ComboBoxItem}">
           <Setter Property="Background" Value="Pink"/>
      </Style>
 </ComboBox.ItemContainerStyle>

答案 1 :(得分:1)

每当我想要做同样的事情时,我就会添加:

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

问题是我将自定义DataTemplate放在ComboBoxItem中。 也许你应该尝试一下......

答案 2 :(得分:0)

实际上,更好的方法是将HorizontalContentAlignment="Stretch"设置为ComboBox级别。即使ComboBox的宽度发生变化(例如,如果它在可调整大小的容器中),这也会起作用。

但是,请注意,这适用于WPF和Silverlight 5,但在某些旧版本的Silverlight中不起作用。