如果选中,请更改ListBox项目的WPF DataTemplate

我需要根据是否select该项目来更改列表框中项目的DataTemplate(选中时显示不同/更多的信息)。

当单击有问题的ListBox项(仅通过Tab键)时,DataTemplate(StackPanel)中的最顶层元素上没有出现GotFocus / LostFocus事件,而且我没有任何想法。

最简单的方法是为“ItemContainerStyle”提供一个模板,而不是“ItemTemplate”属性。 在下面的代码中,我创build了两个数据模板:一个用于“未选中”,一个用于“已选”状态。 然后,我为“ItemContainerStyle”创build一个模板,它是包含该项目的实际“ListBoxItem”。 我将默认的“ContentTemplate”设置为“Unselected”状态,然后在“IsSelected”属性为true时提供一个触发器,用于交换模板。 (注:为简单起见,我将后面的代码中的“ItemsSource”属性设置为string列表)

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

还应该注意的是,stackpanel是不可聚焦的,所以它永远不会获得焦点(如果你真的想聚焦,设置Focusable = True)。 但是,在这种情况下记住的关键是StackPanel是TreeViewItem的项,在这种情况下是ItemContainer。 正如Micah所build议的,调整itemcontainerstyle是一个好方法。

你可以使用DataTemplates来实现,而使用RelativeSouce标记扩展来查找listviewitem的数据触发器

要在select项目时设置样式,或者不需要只需在<DataTemplate>检索ListBoxItem父项,并在其“ IsSelected更改时触发样式更改。 例如,下面的代码将创build一个TextBlock ,其默认Foreground颜色为绿色 。 现在,如果项目被选中,字体将变成红色 ,当鼠标结束时,项目将变成黄色 。 这样,您不需要按照您希望稍微更改的每个状态的其他答案中的build议来指定单独的数据模板。

 <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>