A maneira mais fácil de fazer isso é fornecer um modelo para o "ItemContainerStyle" e NÃO a propriedade "ItemTemplate". No código abaixo, crio 2 modelos de dados: um para os estados "não selecionados" e um para os estados "selecionados". Em seguida, crio um modelo para o "ItemContainerStyle" que é o "ListBoxItem" real que contém o item. Eu defino o "ContentTemplate" padrão para o estado "Unselected" e, em seguida, forneço um gatilho que troca o modelo quando a propriedade "IsSelected" é verdadeira. (Observação: estou definindo a propriedade "ItemsSource" no código por trás de uma lista de strings para simplificar)
<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}" />
BasedOn="{StaticResource {x:Type ListBoxItem}}"
com ListBox. Isso também se aplica a outros controles como TreeView.Para definir o estilo quando o item é selecionado ou não, tudo o que você precisa fazer é recuperar o
ListBoxItem
pai em seu<DataTemplate>
e acionar as mudanças de estilo quando eleIsSelected
mudar. Por exemplo, o código abaixo criará umTextBlock
com aForeground
cor padrão verde . Agora, se o item for selecionado, a fonte ficará vermelha e quando o mouse estiver sobre o item ficará amarelo . Dessa forma, você não precisa especificar modelos de dados separados, conforme sugerido em outras respostas, para cada estado que deseja alterar ligeiramente.fonte
Também deve ser observado que o painel de pilha não pode ser focalizado, então ele nunca receberá o foco (defina Focusable = True se você / realmente / quiser focalizá-lo). No entanto, a chave a lembrar em cenários como este é que o Stackpanel é filho do TreeViewItem, que é o ItemContainer neste caso. Como Micah sugere, ajustar o estilo do item-recipiente é uma boa abordagem.
Você provavelmente poderia fazer isso usando DataTemplates e coisas como datatriggers que usariam a extensão de marcação RelativeSouce para procurar pelo item de exibição de lista
fonte