1

セパレーターで区切られた 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 の場合、次の図のように、コンボボックスが開いて上部にセパレーターが表示されることです (つまり、スクロールバーがスクロールされて、リストの上部にセパレーターが表示されます)。

ここに画像の説明を入力

リストを一番上に開く方法を知っていますか?

前もって感謝します。

4

1 に答える 1

2

最も簡単な解決策は、セパレーター項目の値を、nullではないが無効なID選択を返すものに変更することです。たとえば、匿名型でint.MinValueを使用します。

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

このためには、DataTriggerを次のように変更する必要もあります。

<DataTrigger Binding="{Binding Id}" Value="{x:Static System:Int32.MinValue}">
于 2012-07-30T04:06:11.917 に答える