2016-05-09 12 views
2

Ich habe eine Longlistselector, die eine Reihe von gespeicherten Läufen in einer App zeigt. Die gespeicherten Läufe können Entfernungen in Meilen oder km haben (abhängig von der Kultur, in der die App verwendet wird) und im Allgemeinen halte ich beide im Modell (um zu vermeiden, dass 10 Meilen in 9,9999 Meilen umgewandelt werden) Zeit).ein Steuerelement in einer Longlistselector Vorlage anzeigen/ausblenden

In meiner Artikeltabelle für meinen Longlistselector, wollte ich einfach sowohl metrische als auch imperiale Felder in die Vorlage in xaml einfügen und die nicht nützlichen nach einer Kulturprüfung beim Laden der Seite verstecken.

Ich kann diese Textblöcke jedoch nicht erreichen, indem ich einfach ihre Namen eintippe. Intellisense sieht sie nicht. Ich nehme an, weil dies eine Vorlage ist.

Ist es möglich, zu den Xaml-definierten Textblöcken im Longlistselector ItemTemplate vom Codebehind zu gelangen? Oder sollte ich das ItemTemplate beim Laden in Code erstellen und vorzugsweise die richtigen Textblöcke einfügen? (Kein Fan dieses Ansatzes, aber ich nehme an, ich könnte.)

Ich ging ursprünglich mit einzelnen Feldern und Konvertern, die Entfernungen konvertieren und Einheiten basierend auf Kultur auswählen, aber diese Dinge machten ein wenig unordentlich.

Longlist Selektor sieht wie folgt in der 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

Nach der Reflexion, könnte am einfachsten sein, 2 Vorlagen in XAML zu erstellen und nur die richtige in Code hinter dem Überprüfen von Kulturinformationen anzuwenden. Mehr xaml (aber hauptsächlich kopieren/einfügen) und viel einfacherer Code im Hintergrund. – WPNoviceCoder

Antwort

1

Es gibt mehrere Möglichkeiten, wie Sie Ihre Ziele erreichen können.

1) Wenn Sie wirklich auf die Elemente im DataTemplate mit Namen zugreifen möchten, benötigen Sie die Hilfe des VisualTreeHelper.

Siehe How to access a named control inside a XAML DataTemplate (using CSharp) by Jerry Nixon oder Sie können nur nach DataTemplate-Elementen aus Code-Behind suchen.

2) Sie können einen ItemTemplate Selector verwenden, einen für jede Ihrer Anzeigeeinstellungen. Siehe hier: LongListSelector different item template

3) Oder Sie können einfach nur die Visibility der Textbox an eine Konverterklasse in Ihrem ViewModel anhängen. Zum Beispiel, wenn "Km-Modus" dann Visibility von Meilen TextBlock wäre Collapsed.