引用VirtualizingStackPanel中的项目

时间:2012-03-08 20:22:04

标签: windows-8 microsoft-metro virtualizingstackpanel

我正在玩“网格应用程序”,这是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都有与之关联的对象,所以我可以使用它们,但我不知道如何从那里到各个项目。

所有这些对我来说都是全新的,所以要温柔。 :)

1 个答案:

答案 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)。您也可以在每个项目的数据上直接绑定到属性,指定其图像并跳过转换器部分。