2012-05-10 12 views
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がヌルの場合、コンボボックスが開き、次の図のように上部に区切り文字が表示されます(スクロールバーがスクロールしてリストの上部に区切り文字が表示されます)。

enter image description here

あなたは上部にあるリストの開口部を持っている任意の方法を知っていますか?

ありがとうございます。

答えて

2

最も簡単な解決策は、セパレータ項目の値を無効でない無効なID選択を返すものに変更することです。匿名型でint.MinValueを使用して:最近、この問題を自分で遭遇し、そしてこの溶液が完全に働いた

<DataTrigger Binding="{Binding Id}" Value="{x:Static System:Int32.MinValue}"> 
+0

:このため

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

あなたはまたにDataTriggerを変更する必要があります。 –

関連する問題