2009-04-24 88 views
4

我有一个组合框,并且我已将组合框设置为列表对象的组合框属性属性。类别包含两个属性:“缩写”“名称”。DisplayMemberPath的组合框样式问题

我已经设置了组合框的的DisplayMemberPath为“缩写”,但被设置在组合框不显示缩写属性下面的样式,而是显示“Words.Book”,这是名的类。 ComboBox下拉列表正确显示列表(使用指定的缩写属性)。问题出在选定的组合框项目,当ComboBox的下拉菜单关闭时显示。

我想这个问题是在DataTemplate中的ContentPresenter中,但我无法找到一个成功的解决方案。目前ContentPresenter的内容属性设置为CONTENT =“{TemplateBinding内容}但我不知道这是应该的。

任何想法如何显示所选项目中的DisplayMemberPath指定的属性?

谢谢

代码:

<ControlTemplate x:Key="ComboBoxToggleButton" TargetType="ToggleButton"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition Width="20" /> 
     </Grid.ColumnDefinitions> 
     <Border x:Name="Border" Grid.ColumnSpan="2" CornerRadius="2" BorderThickness="1" Background="{DynamicResource ribbonTitleFade}" /> 
     <Border Grid.Column="0" CornerRadius="2,0,0,2" Margin="1,6,1,6" BorderBrush="{DynamicResource boSecE}" BorderThickness="0,0,1,0" /> 
     <Path x:Name="Arrow" Grid.Column="1" Fill="White" 
       HorizontalAlignment="Center" VerticalAlignment="Center" Data="M 0 0 L 4 4 L 8 0 Z" 
       /> 
    </Grid> 
    <ControlTemplate.Triggers> 
     <Trigger Property="ToggleButton.IsMouseOver" Value="true"> 
      <Setter TargetName="Border" Property="Background" Value="{DynamicResource ribbonTitleFade}" /> 
     </Trigger> 
     <Trigger Property="ToggleButton.IsChecked" Value="true"> 
      <Setter TargetName="Border" Property="Background" Value="{DynamicResource ribbonTitleFade}" /> 
     </Trigger> 
     <Trigger Property="IsEnabled" Value="False"> 
      <Setter TargetName="Border" Property="Background" Value="Black" /> 
      <Setter TargetName="Border" Property="BorderBrush" Value="Black" /> 
      <Setter Property="Foreground" Value="Gray"/> 
      <Setter TargetName="Arrow" Property="Fill" Value="Gray" /> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

<Style x:Key="comboBoxBorderTransparent" TargetType="Control"> 
    <Setter Property="BorderBrush" Value="{DynamicResource boPrimC}" /> 
</Style> 


<Style x:Key="comboItemStyle" TargetType="ComboBoxItem"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ComboBoxItem}"> 
       <Border x:Name="backBorder" > 
        <StackPanel Orientation="Horizontal"> 
         <Rectangle x:Name="rectA" Stroke="White" Width="4" Height="4" Fill="#80FFFFFF" Margin="5,0,0,0" HorizontalAlignment="Left" /> 
         <TextBlock x:Name="text" Foreground="White" FontSize="10px"> 
          <ContentPresenter Margin="8,1,0,1" 
               SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
               HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
               VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
               /> 
         </TextBlock> 
        </StackPanel> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="ComboBoxItem.IsMouseOver" Value="true"> 
         <Setter TargetName="rectA" Property="Stroke" Value="Black" /> 
         <Setter TargetName="rectA" Property="Fill" Value="#80000000" /> 
         <Setter TargetName="backBorder" Property="Background" Value="White"/> 
         <Setter TargetName="text" Property="Foreground" Value="{DynamicResource boPrimC}"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<DataTemplate x:Key="comboSelectedItemTemplate"> 
    <TextBlock Foreground="White" FontSize="10px"> 
     <ContentPresenter Content="{TemplateBinding Content}" /> 
    </TextBlock> 
</DataTemplate> 

<Style TargetType="ComboBox"> 
    <Setter Property="SnapsToDevicePixels" Value="true"/> 
    <Setter Property="OverridesDefaultStyle" Value="true"/> 
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/> 
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/> 
    <Setter Property="ScrollViewer.CanContentScroll" Value="true"/> 
    <Setter Property="MinWidth" Value="60"/> 
    <Setter Property="MinHeight" Value="20"/> 
    <Setter Property="ItemContainerStyle" Value="{DynamicResource comboItemStyle}"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ComboBox"> 
       <Grid> 
        <ToggleButton 
         Name="ToggleButton" Grid.Column="2" 
         Template="{StaticResource ComboBoxToggleButton}" 
         Focusable="false" 
         IsChecked="{Binding Path=IsDropDownOpen,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}" 
         ClickMode="Press"> 
        </ToggleButton> 

        <ContentPresenter HorizontalAlignment="Center" 
             VerticalAlignment="Center" 
             Name="ContentSite" 
             IsHitTestVisible="False" 
             Content="{TemplateBinding SelectionBoxItem}" 
             ContentTemplate="{DynamicResource comboSelectedItemTemplate}" 
             ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" 
             Margin="3,3,23,3" 
             /> 

        <Popup Name="Popup" Placement="Bottom" IsOpen="{TemplateBinding IsDropDownOpen}" 
          AllowsTransparency="False" Focusable="False" PopupAnimation="Slide"> 
         <Grid Name="DropDown" SnapsToDevicePixels="True" 
           MinWidth="{TemplateBinding ActualWidth}" MaxHeight="{TemplateBinding MaxDropDownHeight}"> 
          <Border x:Name="DropDownBorder" Background="{DynamicResource ribbonTitleFade}" 
            BorderThickness="1" BorderBrush="{DynamicResource boPrimC}" /> 
          <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True"> 
           <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" /> 
          </ScrollViewer> 
         </Grid> 
        </Popup> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="HasItems" Value="false"> 
         <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95"/> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="false"> 
         <Setter Property="Foreground" Value="Black"/> 
        </Trigger> 
        <Trigger Property="IsGrouping" Value="true"> 
         <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
        </Trigger> 
        <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="true"> 
         <Setter TargetName="DropDownBorder" Property="CornerRadius" Value="2"/> 
         <Setter TargetName="DropDownBorder" Property="Margin" Value="0"/> 
        </Trigger> 
        <Trigger Property="IsEditable" Value="true"> 
         <Setter Property="IsTabStop" Value="false"/> 
         <!--<Setter TargetName="ContentSite" Property="Visibility" Value="Hidden"/>--> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
    </Style.Triggers> 
</Style> 

回答

3

我想你想要更多的东西像这样在你的ComboBox模板:

<ContentPresenter Content="{TemplateBinding ComboBox.SelectionBoxItem}" 
ContentTemplate="{TemplateBinding ComboBox.SelectionBoxItemTemplate}" 
ContentStringFormat="{TemplateBinding ComboBox.SelectionBoxItemStringFormat}" 
Margin="{TemplateBinding Control.Padding}" 
HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" 
VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" 
SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" /> 
+0

我按照您的建议更改了Content,ContentTemplate和ContentStringFormat,并开始按照它的方式显示它。现在,唯一的问题是我不知道在哪里设置文本的前景刷应该是白色的。我以前在DataTemplate中做过,但是由于这个DataTemplate不再使用,在哪里放置Foreground =“White”的地方是正确的? Thanx – 2009-04-24 11:14:33

0

如果您的模板没有明确处理的DisplayMemberPath值,然后在模板WO不用它来改变ComboBoxItem。您必须直接绑定到成员ControlTemplate,或使用单独的DataTemplate

0

我发现问题与BureauBlack主题哪里会只是不适用的DisplayMemberPath,刚刚出现的对象名称。我有一个包含许多(15+)ComboBox的窗口,除了2个使用DisplayMemberPath正确工作的窗口。

我删除从ContentPresenters和GridViewRowPresenters以下:

Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" 

ListBoxItem中,ComboBoxItem,ListViewItem的。可能还有更多的需求是固定的,但这是我们发现我们正在使用的所有东西。

使用Microsoft.Net 4.0框架。我没有尝试4.5或3.5。