【问题标题】:Referencing an item in a VirtualizingStackPanel引用 VirtualizingStackPanel 中的项目
【发布时间】:2012-03-08 20:22:03
【问题描述】:

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

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

【问题讨论】:

    标签: windows-8 microsoft-metro virtualizingstackpanel


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2011-04-28
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      相关资源
      最近更新 更多