Выпадающий список с разделителем, открывающимся на месте разделителя

Я использую поле со списком, содержащее 2 списка элементов, разделенных разделителем. Я строю это так:

public static ObservableCollection<object> Merge<T, U>(IEnumerable<T> collection1, IEnumerable<U> collection2, bool includeSeparator = true)
{
    if (collection1 == null || collection2 == null)
    {
        throw new ArgumentNullException(collection1 == null ? "collection1" : "collection2");
    }

    List<object> tmp = new List<object>();

    tmp.AddRange(collection1.Cast<object>());

    if (includeSeparator)
    {
        tmp.Add(string.Empty);
    }

    tmp.AddRange(collection2.Cast<object>());

    var ret = new ObservableCollection<object>(tmp);
    return ret;
}

И в xaml:

<ComboBox 
    ItemsSource="{Binding Path=AllValues}" 
    SelectedValue="{Binding Path=SelectedId, Mode=TwoWay, ValidatesOnDataErrors=True}" 
    SelectedValuePath="Id"
    ItemTemplate="{StaticResource CustomItemTemplate}">

    <ComboBox.ItemContainerStyle>
        <Style TargetType="{x:Type ComboBoxItem}" BasedOn="{StaticResource {x:Type ComboBoxItem}}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding}" Value="">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ComboBoxItem}">
                                <Separator HorizontalAlignment="Stretch" IsEnabled="False"/>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>

Он работает, как и ожидалось, у меня есть разделитель, который вставлен в список. Проблема в том, что когда SelectedId имеет значение null, открывается поле со списком, показывающее разделитель вверху (т. е. полоса прокрутки прокручивается, чтобы разделитель был вверху списка), как на следующем рисунке.

введите здесь описание изображения

Знаете ли вы какой-нибудь способ, чтобы список открывался вверху?

Заранее спасибо.


person Shimrod    schedule 10.05.2012    source источник


Ответы (1)


Самым простым решением было бы изменить значение элемента разделителя на что-то, что вернет ненулевой, но недопустимый выбор идентификатора, например. используя int.MinValue в анонимном типе:

tmp.Add(new { Id = int.MinValue }); 

Для этого вам также потребуется изменить DataTrigger на:

<DataTrigger Binding="{Binding Id}" Value="{x:Static System:Int32.MinValue}">
person bstoney    schedule 30.07.2012
comment
Недавно сам столкнулся с этой проблемой, и это решение сработало отлично. - person Michael Sanderson; 26.11.2014