Я думаю, что у вас здесь какая-то путаница, я пытаюсь объяснить как можно лучше.
Прежде всего, вам обычно не нужно менять стиль в коде, как ваш последний блок кода.
Одна вещь, которую трудно понять в начале, это использование ItemContainerStyle
и DataTemplate
.
Я бы посоветовал вам сделать следующее.
Вместо того, чтобы менять стиль вашего ListBoxItem, посмотрите, достаточно ли использовать DataTemplate. DataTemplate определяет, как отображается содержимое вашего ListBoxItem.
<DataTemplate TargetType="{x:Type Foo}">
<!-- your visuals and controls here -->
</DataTemplate>
Теперь, если вы хотите использовать разные шаблоны данных, вы можете использовать разные классы и создавать для них разные DataTemplates, или вы используете DataTemplateSelector
public class FooTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
var mdl = item as Foo;
if( mdl.AppleStyle )
return element.FindResource("appleTemplate") as DataTemplate;
return element.FindResource("normalTemplate") as DataTemplate;
}
}
Создайте этот шаблонный селектор в xaml и укажите его в своем списке
<myNs:FooTemplateSelector x:Key="fooTemplateSelector"/>
<Listbox DataTemplateSelector="{StaticResource fooTemplateSelector}"/>
теперь вам нужно создать 2 DataTemplate
s appleTemplate * normalTemplate *, и вы сможете легко определить, какой шаблон данных использовать во флаконе селектора. Что автоматически делается в ListBox для вас.
Если вы действительно хотите изменить стиль ItemContainer, вы можете использовать ItemContainerStyleSelector , который работает аналогично DataTemplateSelector. Но я бы не стал это предлагать. Вы должны предоставить содержимое и оставить ListBoxItem как есть, только если вы хотите изменить дизайн (в данном случае цвет выделения и т. Д.), В противном случае это может сбить пользователя с толку или нарушить функциональность.