2016-05-09 2 views
2

У меня есть longlistselector, который показывает набор сохраненных прогонов в приложении. Сохраненные прогоны могут иметь расстояния в километрах или километрах (в зависимости от культуры, в которой используется приложение), и в целом я храню оба эти файла в модели (чтобы не превращать 10-мильные пробеги в 9,9999 мили пробега, которые происходят при преобразовании всех время).показать/скрыть элемент управления в шаблоне longlistselector

В моем элементе itemtemplate для моего longlistselector я собирался просто помещать как метрические, так и имперские поля в шаблон в xaml и скрывать ненужные после проверки культуры загрузки страницы.

Я не могу добраться до этих текстовых блоков, просто набрав их имена. Intellisense их не видит. Я предполагаю, что это шаблон.

Можно ли получить текстовые блоки, определенные в xaml, в элементе longlistselector itemtemplate из кода? Или я должен построить itemtemplate в коде при загрузке и предпочтительно разместить правильные текстовые блоки? (Не поклонник этого подхода, но я полагаю, что мог бы.)

Я изначально собирался на это с отдельными полями и конвертерами, которые бы конвертировали расстояния и выбирали единицы на основе культуры, но это делало вещи немного грязными.

селектор лонг выглядит следующим образом в XAML:

<phone:LongListSelector x:Name="SavedRunsListSelector" Margin="0,0,-12,0" ItemsSource="{Binding SavedRuns}"> 
         <phone:LongListSelector.ItemTemplate> 
          <DataTemplate> 
           <StackPanel Margin="0,0,0,0"> 
            <TextBlock Text="{Binding RunName}" Margin="0,0,0,-6" 
            TextWrapping="Wrap" 
            Style="{StaticResource PhoneTextLargeStyle}" 
            Foreground="{StaticResource PhoneAccentBrush}"/> 
          <!--<toolkit:WrapPanel Margin="0,-6,12,0" HorizontalAlignment="Stretch">--> 
           <TextBlock Text="{Binding RunDate, Converter={StaticResource ConverterRunDate}}" 
             TextWrapping="Wrap" HorizontalAlignment="Left" 
             Margin="0,0,0,0" 
             Style="{StaticResource PhoneTextSubtleStyle}" 
             Opacity="1"/> 
           <TextBlock Text="{Binding RunDistMiles, Converter={StaticResource ConverterDistanceMilesWholeString}}" 
            x:Name="textBlockSavedRunsListDistanceMiles" 
            TextWrapping="Wrap" Margin="0,-6,12,0" 
            Style="{StaticResource PhoneTextSubtleStyle}"/> 
          <TextBlock Text="{Binding RunDistKm, Converter={StaticResource ConverterDistanceKmWholeString}}" 
            x:Name="textBlockSavedRunsListDistanceKm" 
            TextWrapping="Wrap" Margin="0,-6,12,0" 
            Style="{StaticResource PhoneTextSubtleStyle}"/> 
          <TextBlock Text="{Binding RunTimeTotalSecs, Converter={StaticResource SecToTimeConverter}}" 
            TextWrapping="Wrap" Margin="0,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/> 
         </StackPanel> 
        </DataTemplate> 
       </phone:LongListSelector.ItemTemplate> 
    </phone:LongListSelector> 
+0

При отражении проще всего создать 2 шаблона в xaml и просто применить правильный код в коде после проверки информации о культуре. Больше xaml (но в основном копирование/вставка) и гораздо более простой код в фоновом режиме. – WPNoviceCoder

ответ

1

Есть несколько способов, которые вы можете достичь своих целей.

1) Если вы действительно хотите получить доступ к элементам в DataTemplate по имени, вам понадобится помощь VisualTreeHelper.

См. How to access a named control inside a XAML DataTemplate (using CSharp) by Jerry Nixon или вы можете просто искать для доступа к элементам DataTemplate из кода.

2) Вы можете использовать ItemTemplate Selector, по одному для каждого из ваших настроек дисплея. См. Здесь: LongListSelector different item template

3) Или вы можете просто в основном привязать текстовое поле Visibility к классу конвертера в вашей модели ViewModel. Например, если режим «Km», то Visibility миль TextBlock будет Collapsed.

Смежные вопросы