2012-03-19 87 views
2

我需要创建一个包含组合框的自定义控件,该组合框的弹出框将绑定对象的名称原型与左侧对齐,并且绑定对象的CreatedDate属性与每个弹出框中的右侧对齐up item。 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> 

回答

4

只需添加这绑定到您的网格yiour 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> 
+0

工作!非常感谢。我们尝试了类似的方法,但是我们没有Mode = OneTime部分,但它不起作用。事实上,删除使得弹出宽度与屏幕一样宽。仅应用背景颜色才能看到网格。 – 2012-03-19 23:20:59

+0

很高兴我能帮到你。如果可能的话,请将此标记为答案! – 2012-03-20 04:59:58

+0

一旦我的声望达到15,我肯定会标记它 – 2012-03-20 22:55:32

1

每当我想要做同样的事情,你问我补充说:

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

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

0

其实,最好的办法是设置HorizontalContentAlignment="Stretch"ComboBox的水平。即使ComboBox的宽度发生变化(例如,如果它位于可调整大小的容器中),这也将起作用。

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