2011-01-27 13 views
2

複数のデータ列を作成したComboBoxを含むカスタムコントロールがあります。 これはうまくいきますが、各列のタイトルでドロップダウンの先頭にヘッダー行を移動する方法を見つけることができませんでした。また、可能であれば、列が色を変えるようにスタイルを設定できることが大好きです。下のXAMLを考えれば、私はこれをどのように行うことができるのでしょうか?私はあなたがそのhereについて読むことができますItemTemplateSelectorを使用しようとするだろう行の代替色についてWPFコンボボックスの列を持つ選択できないヘッダー

<UserControl x:Class="ActualsAllocations.LegalEntityDropDown" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="28" d:DesignWidth="400"> 
    <UserControl.Resources> 
     <ResourceDictionary> 
      <Style x:Key="MainComboStyle" TargetType="{x:Type ComboBoxItem}"> 
       <Style.Triggers> 
       </Style.Triggers> 
      </Style > 
     </ResourceDictionary> 
    </UserControl.Resources> 
    <DockPanel> 
     <Label Name="lblTitle" Width="75" Content="Title" Margin="3,3"/> 
     <ComboBox Name="cmbMain" HorizontalAlignment="Stretch" Margin="3,3" ItemsSource="{Binding}" ItemContainerStyle="{StaticResource MainComboStyle}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding Path=VersionID}" Width="25" Margin="3,0"/> 
         <TextBlock Text="{Binding Path=VersionName}" Width="220" Margin="3,0"/> 
         <TextBlock Text="{Binding Path=EndDate, StringFormat={}{0:M/yyyy}}" Width="50" Margin="3,0" /> 
         <TextBlock Text="{Binding Path=CreatedByUserName}" Width="100" Margin="3,0"/> 
         <TextBlock Text="{Binding Path=CreateDate}" Width="120" Margin="3,0"/> 
        </StackPanel> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ComboBox> 
    </DockPanel> 
</UserControl> 

答えて

1

ヘッダーの場合、CompositeCollectionと記載されています。hereと記載されています。

ItemTemplateSelector既にComboBoxItemになり、Templateは無視されるため、ヘッダーのテンプレートを変更する必要はありません。それは立派になりますので、あなたはスタイリングヘッダを行うことを検討することができます

<DockPanel> 
     <DockPanel.Resources> 
      <Style x:Key="MainComboStyle" TargetType="{x:Type ComboBoxItem}"> 
       <Style.Triggers></Style.Triggers> 
      </Style > 

      <CollectionViewSource x:Key="list" Source="{Binding}"/> 

      <DataTemplate x:Key="EventTemplate"> 
       <StackPanel Orientation="Horizontal" Background="Red"> 
        <TextBlock Text="{Binding Path=VersionID}" Width="25" Margin="3,0"/> 
        <TextBlock Text="{Binding Path=VersionName}" Width="220" Margin="3,0"/> 
        <TextBlock Text="{Binding Path=EndDate, StringFormat={}{0:M/yyyy}}" Width="50" Margin="3,0" /> 
        <TextBlock Text="{Binding Path=CreatedByUserName}" Width="100" Margin="3,0"/> 
        <TextBlock Text="{Binding Path=CreateDate}" Width="120" Margin="3,0"/> 
       </StackPanel> 
      </DataTemplate> 

      <DataTemplate x:Key="OddTemplate"> 
       <StackPanel Orientation="Horizontal" Background="Green"> 
        <TextBlock Text="{Binding Path=VersionID}" Width="25" Margin="3,0"/> 
        <TextBlock Text="{Binding Path=VersionName}" Width="220" Margin="3,0"/> 
        <TextBlock Text="{Binding Path=EndDate, StringFormat={}{0:M/yyyy}}" Width="50" Margin="3,0" /> 
        <TextBlock Text="{Binding Path=CreatedByUserName}" Width="100" Margin="3,0"/> 
        <TextBlock Text="{Binding Path=CreateDate}" Width="120" Margin="3,0"/> 
       </StackPanel> 
      </DataTemplate> 


      <local:CustomTemplateSelector OddTemplate="{StaticResource OddTemplate}" 
              EvenTemplate="{StaticResource EventTemplate}" 
              Collection="{StaticResource list}" 
             x:Key="customTemplateSelector" /> 


     </DockPanel.Resources> 
     <Label Name="lblTitle" Width="75" Content="Title" Margin="3,3"/> 
     <ComboBox Name="cmbMain" HorizontalAlignment="Stretch" Margin="3,3" 
        ItemTemplateSelector="{StaticResource customTemplateSelector}" >     
      <ComboBox.ItemsSource> 
       <CompositeCollection> 
        <ComboBoxItem IsEnabled="False" Foreground="Black"> VersionID | VersionName | EndDate | CreatedByUser | CreateDate</ComboBoxItem> 
        <CollectionContainer Collection="{Binding Source={StaticResource list}}"/> 
       </CompositeCollection> 
      </ComboBox.ItemsSource> 
     </ComboBox> 
    </DockPanel> 

:コンボボックスのため

public class CustomTemplateSelector : DataTemplateSelector 
{   
    public DataTemplate EvenTemplate { get; set; }   

    public DataTemplate OddTemplate { get; set; } 

    public CollectionViewSource Collection { get; set; } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     var list = Collection.Source as IList; 
     if (list != null) 
     { 

      if (list.IndexOf(item) % 2 == 0) 
      { 
       return EvenTemplate; 
      } 
      else 
      { 
       return OddTemplate; 
      } 
     } 
     return EvenTemplate; 
    } 
} 

XAML:

ItemTemplateSelectorのコード。また、このdataTemplatesの一部を別のコントロールに入れて、コードを繰り返さないようにすることもできます。

+0

必須ではありませんが、コード例は常に高く評価されています。 –

+0

私はあなたがそれを好きであることを望むコードを掲載しました。 – baalazamon

+0

@baalazamon CompositeCollectionに提供したリンクを修正してください。 – Khushi