Позоваване на елемент във VirtualizingStackPanel

Играя си с „Grid Application“, което е шаблон за 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 да използвате Data Binding, за да направите каквито и да е промени, от които се нуждаете, за да разграничите потребителския интерфейс. Една от опциите е да използвате IValueConverter, за да получите различно изображение в зависимост от някакво състояние в данните на елемента:

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

Тук предполагам, че кодът на конвертора е написан и екземпляр на конвертора вече е деклариран като ресурс (вижте тук). Като алтернатива можете да направите директно обвързване към свойство на данните на всеки елемент, което указва неговото изображение и да пропуснете частта за преобразуване.

person John Bowen    schedule 09.03.2012