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