Неотбираемый заголовок со столбцами в WPF ComboBox - PullRequest
2 голосов
/ 27 января 2011

У меня есть пользовательский элемент управления, который содержит ComboBox, в котором я создал несколько столбцов данных. Это прекрасно работает, но я не смог понять, как переместить строку заголовка в верхнюю часть раскрывающегося списка с заголовками для каждого из столбцов. Кроме того, если это возможно, хотелось бы иметь возможность стилизовать его так, чтобы ряды чередовали цвета. Учитывая XAML ниже, есть идеи, как мне это сделать?

<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 Ответ

1 голос
/ 27 января 2011

Об альтернативных цветах для строк. Я бы попробовал использовать ItemTemplateSelector . Вы можете прочитать об этом здесь .

Для заголовка я бы попытался использовать CompositeCollection , описанный здесь .

Если вы пойдете на это ItemTemplateSelector вы не будетеНужен другой шаблон для заголовка, так как он уже будет ComboBoxItem и Template будет игнорироваться.

Код для 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>

Вы можете рассмотреть возможность создания стиля заголовка, чтобы он был лучше.Также вы можете поместить часть этих шаблонов данных в отдельный элемент управления, чтобы избежать повторения кода.

...