Cara termudah untuk melakukannya adalah dengan menyediakan template untuk "ItemContainerStyle" dan BUKAN properti "ItemTemplate". Dalam kode di bawah ini saya membuat 2 template data: satu untuk "tidak dipilih" dan satu untuk negara "dipilih". Saya kemudian membuat template untuk "ItemContainerStyle" yang merupakan "ListBoxItem" sebenarnya yang berisi item tersebut. Saya menyetel default "ContentTemplate" ke status "Tidak dipilih", dan kemudian memberikan pemicu yang menukar template saat properti "IsSelected" benar. (Catatan: Saya menyetel properti "SumberSumber" di kode di belakang ke daftar string untuk kesederhanaan)
<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}}"
dengan ListBox. Ini juga berlaku untuk kontrol lain seperti TreeView.Untuk menyetel gaya saat item dipilih atau tidak, yang perlu Anda lakukan adalah mengambil
ListBoxItem
induk di Anda<DataTemplate>
dan gaya pemicu berubah saatIsSelected
berubah. Misalnya kode di bawah ini akan membuatTextBlock
denganForeground
warna default hijau . Sekarang jika item dipilih, font akan berubah menjadi merah dan ketika mouse di atas item akan menjadi kuning . Dengan begitu, Anda tidak perlu menentukan templat data terpisah seperti yang disarankan dalam jawaban lain untuk setiap status yang ingin Anda ubah sedikit.<DataTemplate x:Key="SimpleDataTemplate"> <TextBlock Text="{Binding}"> <TextBlock.Style> <Style> <Setter Property="TextBlock.Foreground" Value="Green"/> <Style.Triggers> <DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={ RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem }}}" Value="True"> <Setter Property="TextBlock.Foreground" Value="Red"/> </DataTrigger> <DataTrigger Binding="{Binding Path=IsMouseOver, RelativeSource={ RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem }}}" Value="True"> <Setter Property="TextBlock.Foreground" Value="Yellow"/> </DataTrigger> </Style.Triggers> </Style> </TextBlock.Style> </TextBlock> </DataTemplate>
sumber
Perlu juga dicatat, bahwa stackpanel tidak dapat difokuskan, sehingga tidak akan pernah mendapatkan fokus (setel Focusable = True jika Anda / benar-benar / ingin fokus). Namun, kunci untuk mengingat dalam skenario seperti ini adalah bahwa stackpanel adalah anak dari TreeViewItem, yang merupakan ItemContainer dalam kasus ini. Seperti yang dikatakan Mikha, mengutak-atik itemcontainerstyle adalah pendekatan yang baik.
Anda mungkin bisa melakukannya menggunakan DataTemplates, dan hal-hal seperti datatriggers yang akan menggunakan ekstensi markup RelativeSouce untuk mencari listviewitem
sumber