88 votes

Changement WPF DataTemplate pour ListBox élément si cette option est sélectionnée

J'ai besoin de changer le DataTemplate pour les éléments d'une liste selon que l'élément est sélectionné ou pas (affichage différent/plus d'informations lorsqu'il est sélectionné).

Je ne suis pas un GotFocus/événement LostFocus sur le premier élément dans le DataTemplate (StackPanel) lorsque vous cliquez sur la zone de liste de point en question (uniquement par le biais de l'utilisation de la tabulation), et je suis à court d'idées.

Merci à l'avance.

180voto

Micah Points 28683

La façon la plus simple de le faire est de fournir un modèle pour le "ItemContainerStyle" et PAS le "ItemTemplate de la propriété". Dans le code ci-dessous j'ai créer 2 modèles: l'un pour le "non sélectionné" et pour la "sélection" des états. J'ai ensuite créer un modèle de la "ItemContainerStyle" qui est le véritable "ListBoxItem" qui contient l'élément. Je définir la valeur par défaut "ContentTemplate" pour le "non sélectionnés" de l'état, et ensuite fournir un déclencheur qui permute le modèle lorsque le "IsSelected" la propriété est vraie. (Note: je suis en train de le "ItemsSource" de la propriété dans le code-behind pour une liste de chaînes de caractères pour des raisons de simplicité)

<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}" />

6voto

Dominic Hopton Points 6052

Il convient également de noter, que le stackpanel n'est pas focuable, donc il ne va jamais obtenir focus (set Focusable=Vrai si vous /vraiment/ le souhaitez). Toutefois, la clé à retenir dans de tels scénarios, c'est que le Stackpanel est l'enfant de la TreeViewItem, qui est le ItemContainer dans ce cas. Comme Michée suggère, modifier la itemcontainerstyle est une bonne approche.

Vous pourriez probablement faire à l'aide de DataTemplates, et des choses comme datatriggers, qui serait le RelativeSouce extension de balisage de chercher la listviewitem

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X