0

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

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

4

1 回答 1

0

一般来说,深入研究 ItemsControl 中的单个模板项并不是一个好主意,因为这不仅很痛苦,而且 ItemTemplate 可以在不同的时间重新生成(虚拟化期间的分页、源集合更新等),你会被遗弃持有不再显示的过时 UIElement。

更好的方法是将您需要的数据提取到项目数据中,并在 ItemTemplate 中使用 Data Binding 进行所需的任何更改以区分 UI。一种选择是使用 IValueConverter 根据项目数据中的某些状态获取不同的图像:

<GridView>
  <GridView.ItemTemplate>
    <DataTemplate>
      <Image Source="{Binding Path=DataState, Converter={StaticResource MyStateToImageConverter}}"/>
    </DataTemplate>
  </GridView.ItemTemplate>
</GridView>

在这里,我假设已经编写了转换器代码,并且转换器的一个实例已经被声明为资源(请参见此处)。您也可以直接绑定到每个项目数据的属性,指定其图像并跳过转换器部分。

于 2012-03-09T18:33:53.290 回答