Ссылка на элемент в VirtualizingStackPanel

Я играю с «сетевым приложением», которое представляет собой шаблон приложения C++ Metro, предоставленный VS11. Основной дисплей представляет собой набор элементов, отображаемых в VirtualizingStackPanel:

<ScrollViewer x:name="itemGridScrollViewer">
  <GridView x:name="itemGridView">
    <GridView.ItemsPanel>
      <ItemsPanelTemplate>
        <VirtualizingStackPanel />
      </ItemsPanelTemplate> 
    </GridView.ItemsPanel>
  </GridView>
</ScrollViewer>

Фактические элементы отображаются с использованием шаблона данных Standard250x250ItemTemplate, определенного в StandardStyles.xaml. Одним из элементов отображения этого является графика.

Я пытаюсь понять, как ссылаться на конкретный элемент, чтобы я мог изменить графику во время выполнения. ScrollViewer и GridView имеют связанные с ними объекты, поэтому я могу добраться до них, но я не вижу, как оттуда перейти к отдельным элементам.

Все это совершенно новое для меня, так что будьте нежны. :)


person chrisd    schedule 08.03.2012    source источник


Ответы (1)


В общем, не рекомендуется копаться в отдельных шаблонных элементах в ItemsControl, потому что это не только больно, но и то, что ItemTemplate может регенерироваться в разное время (подкачка во время виртуализации, обновления исходной коллекции и т. д.), и вы останетесь содержащий устаревший UIElement, который больше не отображается.

Лучшим подходом является извлечение необходимых данных в данные элемента, а в ItemTemplate используйте привязку данных, чтобы внести любые изменения, необходимые для дифференциации пользовательского интерфейса. Один из вариантов — использовать IValueConverter для получения другого изображения в зависимости от некоторого состояния в данных элемента:

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

Здесь я предполагаю, что код преобразователя был написан, и экземпляр преобразователя уже объявлен как ресурс (см. здесь). В качестве альтернативы вы можете сделать прямую привязку к свойству данных каждого элемента, которое указывает его изображение, и пропустить часть преобразователя.

person John Bowen    schedule 09.03.2012