#wpf #xaml
#wpf #xaml
Вопрос:
Я использую ControlTemplate для моих элементов ListBoxItems для данного ListBox. ControlTemplate определен в стиле и содержит прямоугольник, видимость которого необходимо переключать на основе AlternationIndex. Хотя я вижу, как использовать AlternationIndex для непосредственного управления фоном элемента ListBoxItem, я не уверен, как использовать триггер для ссылки на именованный элемент в моем шаблоне управления. Приветствуется любой ввод:
Выдержка из XAML:
<Style x:Key="ListBoxItemStyle" TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Grid Height="84" Width="700">
<!--
TURN ME ON FOR EVERY EVEN NUMBERED LIST ITEM
-->
<Rectangle x:Name="_listItemBg" Width="700" Height="83" Opacity="0.12">
...
Я пробовал следующее, но безрезультатно. Правильный синтаксис XAML ускользает от меня:
<ControlTemplate.Triggers>
<Trigger Property="ItemsControl.AlternationIndex" Value="0">
<Setter Property="Rectangle.Visibility" TargetName="_listItemBg" Value="Hidden" />
</Trigger>
<Trigger Property="ItemsControl.AlternationIndex" Value="1">
<Setter Property="Rectangle.Visibility" TargetName="_listItemBg" Value="Visible" />
</Trigger>
…
Комментарии:
1. Это может быть потому, что вы явно установили Visibility = «Видимый» в определении прямоугольника. Попробуйте удалить это и позволить установщику стиля позаботиться об этом.
2. Спасибо, но, похоже, это не то. Теперь я обновил триггер, чтобы включить атрибут TargetName, но, хотя я не вижу ошибок привязки в выходных данных, похоже, что он не работает. Триггер и прямоугольник выше были обновлены, чтобы отразить эту последнюю попытку.
3. Основываясь на вашем комментарии, Мэтт, мне показалось, что, возможно, мне нужны два дополнительных триггера — один, чтобы скрыть прямоугольник, а другой, чтобы показать его. Я обновил XAML. К сожалению, это также не работает.
4. Да, я не видел, чтобы AlternationIndex использовался в ControlTemplate подобным образом — только в стиле. Может быть, вы могли бы задать стиль для вашего прямоугольника и использовать привязку RelativeSource для нахождения текущего значения AlternationIndex?
Ответ №1:
Возможно, вы забыли установить AlternationCount
? В любом случае, вот небольшой автономный рабочий пример, основанный на вашем коде:
<Grid>
<Grid.Resources>
<PointCollection x:Key="sampleData">
<Point>1,2</Point>
<Point>3,4</Point>
<Point>5,6</Point>
</PointCollection>
</Grid.Resources>
<ListBox ItemsSource="{StaticResource sampleData}" AlternationCount="2">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Grid Height="84" Width="700">
<Rectangle x:Name="_listItemBg" Width="700" Height="83" Fill="Red" Opacity="0.12"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="ItemsControl.AlternationIndex" Value="0">
<Setter Property="Rectangle.Visibility" TargetName="_listItemBg" Value="Hidden" />
</Trigger>
<Trigger Property="ItemsControl.AlternationIndex" Value="1">
<Setter Property="Rectangle.Visibility" TargetName="_listItemBg" Value="Visible" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
</Grid>
Комментарии:
1. Действительно, я забыл установить AlternationCount, поскольку не осознавал, что мне это нужно. Спасибо, Рик!