Q101. ListBoxItem で子要素の編集時に強調表示するには?
A.IsKeyboardFocusWithin プロパティが True の場合、IsSelected プロパティを true にするよう、ListBoxItem のスタイルにトリガーを設定します。
DataTemplate で ListBoxItem に TextBox などの編集用コントロールを設けた場合、子要素の TextBox にフォーカスがあっても強調表示されないことがあります。以下の画像は4行目のTextBox にフォーカスがありますが、2行目がハイライトのままの状態です。
<ListBox ItemsSource="{Binding Persons}" Grid.Row="1" > <ListBox.ItemTemplate> <DataTemplate> <Grid > <Grid.ColumnDefinitions> <ColumnDefinition Width="100" /> <ColumnDefinition Width="80" /> </Grid.ColumnDefinitions> <TextBlock Grid.Column="0" VerticalAlignment="Center" Text="{Binding Path=Name, Mode=OneWay}" /> <TextBox Grid.Column="1" Text="{Binding Path=Age, Mode=TwoWay}" Margin="2,4" /> </Grid> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
TextBox 編集時に項目を強調表示にするには、以下のように ListBoxItem のスタイルにトリガーを設定します。
<ListBox ItemsSource="{Binding Persons}" SelectedIndex="0" Grid.Row="1" > <ListBox.Resources> <Style TargetType="ListBoxItem"> <!-- このトリガーを設けないと子要素編集時に強調表示しない --> <Style.Triggers> <Trigger Property="IsKeyboardFocusWithin" Value="true"> <Setter Property="IsSelected" Value="true" /> </Trigger> </Style.Triggers> </Style> </ListBox.Resources> <ListBox.ItemTemplate> <DataTemplate> <Grid > <Grid.ColumnDefinitions> <ColumnDefinition Width="100" /> <ColumnDefinition Width="80" /> </Grid.ColumnDefinitions> <TextBlock Grid.Column="0" VerticalAlignment="Center" Text="{Binding Path=Name, Mode=OneWay}" /> <TextBox Grid.Column="1" Text="{Binding Path=Age, Mode=TwoWay}" Margin="2,4" /> </Grid> </DataTemplate> </ListBox.ItemTemplate> </ListBox>