2011-01-27 24 views
2

我有一個自定義控件,其中包含一個ComboBox,其中創建了多個數據列。 這個效果很好,但我一直無法弄清楚如何將標題行置於下拉列表的頂部,併爲每個列標題。此外,如果可能的話,它會喜歡能夠對其進行設計,以便行可以交替使用顏色。鑑於下面的XAML,我如何做到這一點的任何想法?帶有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

關於替代顏色的行我會嘗試使用ItemTemplateSelector你可以閱讀有關here

對於標題我會嘗試使用CompositeCollection描述here

如果你去這ItemTemplateSelector你不需要爲不同的模板頭,因爲它將已經ComboBoxItem和模板將被忽略。

代碼ItemTemplateSelector:

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組合框:

<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> 

你可以考慮做造型頭所以這將是更好的。您也可以將這些dataTemplates的一部分放在單獨的控件中,以避免重複代碼。

+0

不需要,但代碼示例總是讚賞。 – 2011-01-27 19:25:00