我有一个这样的ListView:
<ListView ItemsSource="{Binding Source}" SelectionMode="Single"
ItemTemplate="{StaticResource MyItemTemplate}"
IsItemClickEnabled="True" ItemClick="ListView_OnItemClick">
</ListView>
我要实现的是,将选择/单击的元素设置为不同于其他元素的样式,然后在选择另一个元素时再次返回。对我来说,最简单的方法是,如果有某种方法可以更改所选项目的DataTemplate。如果那是不可能的,那么任何解决方案都将受到赞赏。
我尝试使用DataTemplateSelector,但无法正常工作。不确定所选项目的更改是否会重新选择模板。
最佳答案
打算在数据类型更改时使用DataTemplateSelector。例如,假设您有一个名为Person的基类和两个继承的Professor和Student类。您可能会有一个既包含教授又包含学生的名为People的集合。在显示教授对象时,可以使用DataTemplateSelector来使用一个数据模板,而在显示学生对象时,可以使用DataTemplateSelector来使用一个数据模板。
DataTemplateSelector和DataTemplate可能不是您想要的,因为它们通常与选择没有任何关系。选中一个项目时看到的所有UI元素(选中,紫色边框等)都是ItemContainer的一部分。在运行时,DataTemplate放置在ItemContainer的内部,您可以通过编辑ContainerTemplate进行更改。
在Expression Blend中,右键单击ListView,然后选择“编辑其他模板”->“编辑生成的项目容器(ItemContainerStyle)”->“编辑副本”。您需要给自定义容器命名,我建议将其保存在应用程序级别而不是当前页面(否则,您将无法在其他页面上使用它)。
给它起一个名字并单击“确定”后,Blend将切换到您正在编辑容器(而不是页面)的模式。确保已打开“状态”面板(如果没有看到,则打开“窗口->状态”),并且应该看到一堆状态。您要编辑的一个称为“选定”,它在名为“ SelectionStates”的组中。
完成更改后,单击“对象和时间轴”面板顶部的按钮,该按钮看起来像带有向上箭头的水平线(将鼠标悬停在此按钮上时,它将显示“将范围返回[页面]”) 。现在,您将回到编辑页面,而不是编辑容器。运行您的应用程序,您应该看到差异。
注意:使用此方法,您可以更改有关容器的任何内容。诸如边框之类的东西,或使该项目在3D空间中变大或变小或倾斜的属性(使用属性窗格中“变换”组下的“投影”进行倾斜)。但是,您将无法显示或隐藏DataTemplate的一部分。例如,当客户未被选中时,您将无法隐藏他们的名字。对于这些更改,您可能必须使用自己的自定义DataTemplateSelector尝试一些操作。但是我不知道当要求DataTemplateSelector生成模板时是否可以检查是否选择了一个项目。
开发支持,设计支持以及更多出色的功能:http://bit.ly/winappsupport