2009-04-24 91 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。