我正在使用一个包含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
为空时,组合框打开显示顶部的分隔符(即滚动条滚动以使分隔符位于列表顶部),如下图所示。
你知道如何让列表在顶部开放吗?
提前致谢。
答案 0 :(得分:2)
最简单的解决方案是将分隔符项值更改为将返回非空但无效的Id选择的内容,例如:在匿名类型中使用int.MinValue:
tmp.Add(new { Id = int.MinValue });
为此,您还需要将DataTrigger更改为:
<DataTrigger Binding="{Binding Id}" Value="{x:Static System:Int32.MinValue}">