我需要根据是否选择项目来更改列表框中项目的数据模板(选择时显示不同/更多信息)。
单击有问题的ListBox项(仅通过制表键)时,在DataTemplate(堆栈面板)的最顶层元素上没有出现GotFocus / LostFocus事件,并且我没有主意。
Answers:
最简单的方法是为“ ItemContainerStyle”而不是“ ItemTemplate”属性提供模板。在下面的代码中,我创建了2个数据模板:一个用于“未选中”状态,一个用于“选中”状态。然后,我为“ ItemContainerStyle”创建一个模板,该模板是包含该项目的实际“ ListBoxItem”。我将默认的“ ContentTemplate”设置为“ Unselected”状态,然后提供一个触发器,当“ IsSelected”属性为true时,该触发器将交换出模板。(注意:为简单起见,我将后面代码中的“ 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}" />
BasedOn="{StaticResource {x:Type ListBoxItem}}"
与ListBox一起使用。这也适用于其他控件,例如TreeView。
要在选择项目或不选择项目时设置样式,只需检索ListBoxItem
您的父项,<DataTemplate>
然后在样式更改时触发样式IsSelected
更改。例如,下面的代码将创建一个TextBlock
默认Foreground
颜色为绿色的。现在,如果选中该项目,则字体将变为红色,并且当鼠标悬停在该项目上时,该字体将变为黄色。这样,您就无需为其他想要稍微改变的状态指定其他回答中建议的单独的数据模板。
<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>