在没有选择的情况下突出显示ComboBox中的第一个项目

时间:2012-08-08 12:24:00

标签: wpf silverlight

我有一个附加到ComboBox控件的自定义行为。

在我想要的行为中,默认情况下,突出显示实现增量搜索的ComboBox的第一项。我的意思是在弹出窗口中的时刻结果呈现第一个项目应该突出显示但未选中。

这意味着我无法使用SelectedIndex = 0,因为它也会选择该项目。我想保持ComboBox为空,但将项目的可视状态设置为高亮显示。

我看到IsHighlightedProperty中有一个ComboBoxItem,但是它已被注册为只读dp,因此没有帮助。

无论如何我能做到吗?

2 个答案:

答案 0 :(得分:1)

您可以使用ComboBox的AlternationIndex属性来获取项目的索引,然后使用触发器为第一个设置颜色,而不是使用转换器。将交替索引设置为始终大于ComboBox中的项目数,以便只有一个项目的索引为0.突出显示该项目的样式将类似于:

    <Style x:Key="FirstColor" TargetType="{x:Type ListBoxItem}">
        <Style.Triggers>
            <Trigger Property="ComboBox.AlternationIndex" Value="0">
                <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
            </Trigger>
        </Style.Triggers>            
    </Style>

你的ComboBox看起来像这样:

<ComboBox ItemsSource="{Binding Items}" SelectedIndex="-1" 
          AlternationCount="500" 
          ItemContainerStyle="{StaticResource FirstColor}"/>

HighlightBrushKey将使用现有的突出显示样式而不是自定义颜色。

答案 1 :(得分:0)

您的商品列表应该是某种ItemsControl(即ComboBoxListBoxListViewTreeView等)对吗?

所以它必须有一个ItemTemplate属性......

那样ItemTemplate          添加将要拥有的DataTrigger                   MultiBinding到两个属性......

  1. 列表项的当前数据上下文... {Binding}
  2. 列表的ItemsSource ... {Binding ItemsSource, RelativeSource={RelativeSource AncetsrType={x:Type ItemsControl}}}
  3. 如果

    MultiBinding.Converter将返回true
      values[0] == ((IEnumerable)values[1]).Cast<object>().First()
    

    然后根据DataTrigger中的这个标志,您可以将所需的任何样式应用于列表中的第一个项目!

    希望这有帮助。