2

我有一个这样的 ListView:

<ListView ItemsSource="{Binding Source}" SelectionMode="Single"
ItemTemplate="{StaticResource MyItemTemplate}"
IsItemClickEnabled="True" ItemClick="ListView_OnItemClick">
</ListView>

我想要实现的是将被选择/单击的元素设置为与其他元素不同的样式,并在选择另一个元素时再次返回。对我来说,最简单的方法是如果有某种方法可以更改所选项目的 DataTemplate。如果那不可能,任何类型的解决方案都非常感谢。

我尝试使用 DataTemplateSelector,但无法正常工作。不确定当所选项目发生变化时是否会重新选择模板。

4

1 回答 1

4

DataTemplateSelector旨在在数据类型更改时使用。例如,假设您有一个名为Person的基类和两个继承的类ProfessorStudent。您可以有一个名为People的集合,其中包含教授和学生。您将使用DataTemplateSelector在显示教授对象时使用一个数据模板,而另一个用于显示学生对象。

DataTemplateSelectorDataTemplate可能不是您想要的,因为它们通常与选择没有任何关系。您在选择项目时看到的所有 UI 元素(复选、紫色边框等)都是ItemContainer的一部分。在运行时,DataTemplate被放置在ItemContainer内,您可以通过编辑ContainerTemplate来更改它。

在 Expression Blend 中,右键单击 ListView 并选择Edit Additional Templates -> Edit Generated Item Container (ItemContainerStyle) -> Edit a Copy。您需要为自定义容器命名,我建议将其保存在应用级别而不是当前页面(否则您将无法在其他页面上使用它)。

给它一个名称并单击确定后,Blend 将切换到您正在编辑容器(而不是页面)的模式。确保您打开了状态面板(Window -> States如果您没有看到它),您应该会看到一堆状态。您要编辑的那个称为Selected,它位于名为SelectionStates的组中。

完成更改后,单击“对象和时间轴”面板顶部的按钮,该按钮看起来像带有向上箭头的水平线(当您将鼠标悬停在此按钮上时,它会显示“将范围返回到 [页面]”) . 现在您回到编辑页面而不是编辑容器。运行您的应用程序,您应该会看到差异。

注意:使用此方法,您可以更改有关容器的任何内容。诸如边框之类的东西,或者使项目更大或更小或在 3D 空间中倾斜(使用属性窗格中“变换”组下的“投影”来倾斜)。但是,您将无法显示或隐藏 DataTemplate 的某些部分。例如,当客户未被选中时,您将无法隐藏他们的名字。对于这些类型的更改,您可能必须尝试使用​​您自己的自定义 DataTemplateSelector。但我不知道是否可以在要求 DataTemplateSelector 生成模板时检查是否选择了某个项目。

开发支持、设计支持和更多的好处:http: //bit.ly/winappsupport

于 2013-02-27T18:43:37.403 回答