我需要创建一个包含组合框的自定义控件,其弹出窗口将左边对齐的绑定对象的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>
答案 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中不起作用。