Самый легкий способ сделать это должно предоставить шаблон для "ItemContainerStyle" а НЕ свойства "ItemTemplate". В коде ниже я создаю 2 шаблона данных: один для "отменявшего" и один для "выбранных" состояний. Я тогда создаю шаблон для "ItemContainerStyle", который является фактическим "ListBoxItem", который содержит объект. Я установил значение по умолчанию "ContentTemplate" на "Отменявшее" состояние, и затем предоставляю триггер, который выгружает шаблон, когда свойство "IsSelected" верно. (Отметьте: Я устанавливаю свойство "ItemsSource" в коде позади к списку строк для простоты)
<Window.Resources>
<DataTemplate x:Key="ItemTemplate">
<TextBlock Text="{Binding}" Foreground="Red" />
</DataTemplate>
<DataTemplate x:Key="SelectedTemplate">
<TextBlock Text="{Binding}" Foreground="White" />
</DataTemplate>
<Style TargetType="{x:Type ListBoxItem}" x:Key="ContainerStyle">
<Setter Property="ContentTemplate" Value="{StaticResource ItemTemplate}" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource SelectedTemplate}" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<ListBox x:Name="lstItems" ItemContainerStyle="{StaticResource ContainerStyle}" />
Это должно также быть отмечено, что stackpanel не focuable, таким образом, это никогда не собирается добираться, фокус (установите Focusable=True, если Вы/really/хотите сфокусированный). Однако ключ для запоминания в сценариях как это - то, что Stackpanel ребенок из TreeViewItem, который является ItemContainer в этом случае. Как Micah предполагает, настраивание itemcontainerstyle является хорошим подходом.
Вы могли, вероятно, сделать это использование DataTemplates и вещи, такие как datatriggers, который будет использовать расширение разметки RelativeSouce для поиска listviewitem