0

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

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

这意味着我不能使用SelectedIndex = 0,因为它也会选择该项目。我想将 ComboBox 保持为空,但将项目的视觉状态设置为突出显示的状态。

我看到有一个IsHighlightedPropertyinComboBoxItem但它被注册为只读 dp 所以没有帮助。

无论如何我可以做到这一点吗?

4

2 回答 2

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使用现有的突出显示样式而不是自定义颜色。

于 2012-08-08T13:47:09.613 回答
0

您的项目列表应该是某种ItemsControl(即,,,ComboBoxListBoxListViewTreeView吗?

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

因此,在其中ItemTemplate 添加一个DataTrigger将具有 MultiBinding两个属性的...

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

MultiBinding.Converter返回 true 如果

  values[0] == ((IEnumerable)values[1]).Cast<object>().First()

然后基于此标志,DataTrigger您可以将任何您想要的样式应用于列表中的第一个项目!

希望这可以帮助。

于 2012-08-08T13:21:21.063 回答