Как определить индекс текущего элемента ListBox из DataTemplate?

У меня есть ListBox. Теперь я хочу написать DataTemplate таким образом, чтобы у первого элемента был красный фон и белый фон для других элементов. Думаю, мне нужно написать DataTrigger, но я понятия не имею, как определить, что DataTemplate применяется к первому элементу.


person levanovd    schedule 15.11.2009    source источник


Ответы (1)


элементы управления элементами имеют счетчик чередования, который вы используете для стилизации против

посмотрите здесь:

<Style TargetType="{x:Type ListBoxItem}">
    <Style.Triggers>
        <Trigger Property="ItemsControl.AlternationIndex" Value="0">
            <Setter Property="Background" Value="LightBlue"></Setter>
        </Trigger>
        <Trigger Property="ItemsControl.AlternationIndex" Value="1">
            <Setter Property="Background" Value="LightGreen"></Setter>
        </Trigger>
    </Style.Triggers>
</Style>

Наслаждайтесь!

person Aran Mulholland    schedule 15.11.2009
comment
Это отличная функция, спасибо за информацию. Но мне нужен только первый элемент с красным фоном, а не каждый элемент, где (itemIndex% AlternationCount) == 0. Конечно, я могу привязать AlternationCount к ItemsSource.Count, но нет ничего лучше как это сделать? - person levanovd; 15.11.2009
comment
то, что вы обрисовываете, звучит приемлемо, все в xaml. он выполняет свою работу, и вы можете двигаться дальше к лучшему. кто-то другой может предложить более элегантное решение. вы можете выполнить мульти-привязку с первой привязкой привязки к текущему элементу, а второй привязкой к предку, привязкой к источнику элементов списка. тогда в вашем конвертере вы можете проверить, каков индекс элемента. но ваше решение выше находится в xaml. Я всегда за удобочитаемость. это на виду в xaml, а не заперто в конвертере - person Aran Mulholland; 15.11.2009
comment
Нет необходимости связывать AlternationCount с ItemsSource.Count: просто установите для него значение Int32.MaxValue в XAML. (Я предпочитаю AlternationCount = 2147483647, а не использовать {x: Static sys: Int32.Maxvalue}, поскольку он быстрее и 2 ^ 31-1 распознается большинством программистов). - person Ray Burns; 16.11.2009