Как получить доступ к элементу управления, присутствующему внутри шаблона данных списка в приложении Metro?

Я разрабатываю приложение для метро Windows 8, в котором у меня есть список, содержащий набор текстовых блоков и изображение.

<ListBox x:Name="lstbxbStudents" Background="Transparent"  ItemContainerStyleSelector="{StaticResource ItemStyleSelector}" ScrollViewer.VerticalScrollBarVisibility="Auto" ItemTemplate="{StaticResource LandscapeItemTemplate}"   Height="476"    SelectionChanged="lstbxbProducts_SelectionChanged_1"  Style="{StaticResource ListBoxStyle1}" HorizontalAlignment="Left" Width="901">
</ListBox>

Для этого изображения ImgCmt я установил источник статического изображения внутри шаблона данных списка.

<Page.Resources> 

    <CollectionViewSource x:Name="cvs2" IsSourceGrouped="true" />
    <!-- TODO: Delete this line if the key AppName is declared in App.xaml -->
    <x:String x:Key="AppName">Students Screen</x:String>

    <DataTemplate x:Key="LandscapeItemTemplate" >
        <StackPanel Orientation="Horizontal">
            <StackPanel Width="30"></StackPanel>
            <StackPanel Width="120"  Orientation="Horizontal">
                <TextBlock Text="{Binding stunum}" VerticalAlignment="Center" HorizontalAlignment="Left" />
            </StackPanel>
            <StackPanel Width="350">
                <TextBlock Text="{Binding studsc}"   HorizontalAlignment="Left" />
            </StackPanel>
            <StackPanel Width="10"></StackPanel>
            <StackPanel   Width="100">
                <TextBlock Text="{Binding stuum}" x:Name="txtblkstuum"   HorizontalAlignment="Left" />
                </StackPanel>    
            <StackPanel Width="150">
                <TextBlock Text="{Binding stugrp}" VerticalAlignment="Center" TextAlignment="Right" HorizontalAlignment="Center" />
            </StackPanel>
            <StackPanel Width="100">
                <TextBlock Text="{Binding stusection, Mode=TwoWay}"  TextAlignment="Center" x:Name="txtbxbstusection" Tag="{Binding stunum}"     VerticalAlignment="Center"   HorizontalAlignment="Right" />
            </StackPanel>
            <StackPanel Width="50"></StackPanel>
            <StackPanel>
                <Image  Source="Assets/comments.png" Name="ImgCmt"  PointerPressed="Image_PointerPressed_1" VerticalAlignment="Center" Width="20" Height="20"></Image>
            </StackPanel>        
        </StackPanel>
    </DataTemplate>

</Page.Resources>

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

Как я могу это сделать :

  1. Как получить доступ к элементу управления, присутствующему внутри шаблона данных списка в приложении Metro?

  2. Какими способами я могу это сделать?

  3. Как я могу изменить источник изображения на другой источник изображения (изменить изображение) в отделенном коде в зависимости от некоторых условий?


person user1516781    schedule 25.07.2013    source источник
comment
Считается вежливым отметить правильный ответ.   -  person Jerry Nixon    schedule 30.07.2013


Ответы (1)


Это распространенный вопрос. Мы все спрашивали об этом хотя бы раз. Проблема в том, что эти элементы управления не имеют уникального имени, потому что они находятся в повторителе. В результате вы не можете использовать логическое дерево в XAML. Логическое дерево — это то, что позволяет вам называть вещи по именам. Вместо этого вам нужно использовать визуальное дерево в XAML. Визуальное дерево — это то, что позволяет вам получить доступ ко всему на экране, включая динамически отображаемые элементы, которые украшают элементы управления и заполняют повторители. Поскольку визуальное дерево такое большое, а ретранслятор повторяется, вам все равно придется ограничивать область визуального дерева, чтобы вы могли надежно определить местонахождение элемента управления, который вы хотите найти. Я надеюсь это имеет смысл.

Решение здесь: http://blog.jerrynixon.com/2012/09/how-to-access-named-control-inside-xaml.html

person Jerry Nixon    schedule 25.07.2013