我正在玩“网格应用程序”,这是VS11提供的C ++ Metro应用程序模板。主显示是VirtualizingStackPanel中显示的项目集合:
<ScrollViewer x:name="itemGridScrollViewer">
<GridView x:name="itemGridView">
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</GridView.ItemsPanel>
</GridView>
</ScrollViewer>
使用StandardStyles.xaml中定义的Standard250x250ItemTemplate数据模板显示实际项目。其中一个显示元素是图形。
我正在尝试了解如何引用特定项目,以便我可以在运行时更改图形。 ScrollViewer和GridView都有与之关联的对象,所以我可以使用它们,但我不知道如何从那里到各个项目。
所有这些对我来说都是全新的,所以要温柔。 :)
答案 0 :(得分:0)
一般来说,在ItemsControl中挖掘单个模板化项目并不是一个好主意,因为它不仅是一个痛苦,而且ItemTemplate可以在不同时间重新生成(虚拟化期间的分页,源集合更新等)和你'将留下一个不再显示的过时的UIElement。
更好的方法是将所需数据提取到项目数据中,并在ItemTemplate中使用数据绑定来进行区分UI所需的任何更改。一种选择是根据项目数据中的某些状态使用IValueConverter获取不同的图像:
<GridView>
<GridView.ItemTemplate>
<DataTemplate>
<Image Source="{Binding Path=DataState, Converter={StaticResource MyStateToImageConverter}}"/>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
这里我假设已经编写了转换器代码,并且已经将转换器的实例声明为资源(see here)。您也可以在每个项目的数据上直接绑定到属性,指定其图像并跳过转换器部分。