我需要更改ListBox中项目的DataTemplate,具体取决于项目是否被选中(选中时显示不同/更多信息).
当单击有问题的ListBox项目时(仅通过Tab键),我没有在DataTemplate(StackPanel)的最顶层元素上获得GotFocus/LostFocus事件,而且我没有想法.
最简单的方法是为"ItemContainerStyle"而不是"ItemTemplate"属性提供模板.在下面的代码中,我创建了2个数据模板:一个用于"未选定",另一个用于"选定"状态.然后我为"ItemContainerStyle"创建一个模板,它是包含该项的实际"ListBoxItem".我将默认的"ContentTemplate"设置为"Unselected"状态,然后提供一个触发器,当"IsSelected"属性为true时,该触发器交换模板.(注意:为了简单起见,我将代码中的"ItemsSource"属性设置为字符串列表)
要在选择项目时设置样式,或者不需要做的只是ListBoxItem
在
更改时检索和触发样式更改中的父项IsSelected
.例如,下面的代码将创建一个TextBlock
默认Foreground
颜色为绿色.现在,如果项目被选中,字体将变为红色,当鼠标结束时,该项目将变为黄色.这样,您就不需要像其他答案中所建议的那样为每个您想稍微改变的状态指定单独的数据模板.
还应该注意的是,stackpanel是不可聚焦的,所以它永远不会得到焦点(如果你/真的/希望它聚焦,设置Focusable = True).但是,在这样的场景中要记住的关键是Stackpanel是TreeViewItem的子代,在这种情况下是ItemContainer.正如Micah所说,调整itemcontainerstyle是一个很好的方法.
您可以使用DataTemplates以及诸如datatriggers之类的东西来使用RelativeSouce标记扩展来查找listviewitem