1. ホーム
  2. .net

[解決済み] リストボックスの項目が選択されたらWPF DataTemplateを変更する

2023-03-06 15:42:14

質問

ListBoxの項目が選択されているかどうかによってDataTemplateを変更する必要があります(選択されたときに異なる/より多くの情報を表示する)。

問題のListBoxのアイテムをクリックしても、DataTemplateの一番上の要素(StackPanel)にGotFocus/LostFocusイベントが発生せず(タブ操作のみ)、お手上げ状態です。

どのように解決するのですか?

最も簡単な方法は、"ItemContainerStyle" にテンプレートを提供し、"ItemTemplate" プロパティには与えないことです。以下のコードでは、2つのデータ・テンプレートを作成しています。1つは"unselected"、もう1つは"selected"の状態に対応するものです。次に、アイテムを含む実際のリストボックスである "ItemContainerStyle" 用のテンプレートを作成します。デフォルトの "ContentTemplate" を "Unselected" 状態に設定し、次に "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}" />