2016-11-10 6 views
1

Ich bin ein 10 Universal-App gewinnen zu machen, und ich habe zwei Arrays von Objekten:UWP Schalter Datenvorlage - rebinding ItemSource

private ObservableCollection<Song> Songs; 
private ObservableCollection<JonPlaylist> Playlists; 

und eine Listenansicht in ihnen die Daten anzuzeigen:

<Page.Resources> 
     <DataTemplate x:DataType="data:Song" x:Key="SongDataTemplate"> 
      <StackPanel> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Name="ListSongName" Text="{x:Bind Title}" VerticalAlignment="Bottom" HorizontalAlignment="Left"/> 
        <TextBlock Name="ListArtist" Text="{x:Bind Artist}" VerticalAlignment="Bottom" HorizontalAlignment="Left"/> 
       </StackPanel> 
      </StackPanel> 
     </DataTemplate> 

    <DataTemplate x:DataType="data:JonPlaylist" x:Key="PlaylistDataTemplate"> 
     <StackPanel> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Name="ListSongName" Text="{x:Bind Title}" VerticalAlignment="Bottom" HorizontalAlignment="Left"/> 
      </StackPanel> 
     </StackPanel> 
    </DataTemplate> 

</Page.Resources> 

Listenansicht:

<ListView Name="SongListView" ItemsSource="{x:Bind Songs}" IsItemClickEnabled="True" 
        ItemClick="SongListView_ItemClick" 
ItemTemplate="{StaticResource SongDataTemplate}" /> 

Das Problem ist, dass ich zwischen den beiden Arrays/Sammlungen wechseln können, wollen die sind verschiedener Datentypen.

Ich habe versucht, dies mit den Datenvorlagen als Seite resourses zu erreichen, und die listView.ItemSource und listView.ItemTemplate rebinding:

private void SwitchViewButton_Click(object sender, RoutedEventArgs e) 
{ 
      SongListView.ItemsSource = Playlists[0].GetType(); 
      SongListView.ItemTemplate = this.Resources.ElementAt(1); 


} 

Ich weiß nicht, aber wenn dies funktionieren wird. Wird es besser sein, Benutzersteuerelemente und einen visuellen Zustandsverwalter zu verwenden?

Antwort

0

Anstatt zu versuchen, eine einzelne Listenansicht erneut zu binden/neu zu gestalten, haben Sie zwei Listenansicht-Steuerelemente und zeigen/verbergen sie wie erforderlich.

Ich würde sehr empfehlen, den VisualStateManager dazu zu verwenden und die x:DeferLoadStrategy="Lazy" zu verwenden, um Leistungsprobleme zu beheben.

Lassen Sie mich wissen, wenn Sie weitere Informationen zu den oben genannten benötigen.

+0

Danke, das Ändern des Sichtbarkeitswerts reicht jetzt aus. – Jon

+0

Ich erhalte eine nullReferenceException, wenn ich versuche, die Sichtbarkeit von defered Objekten zu manipulieren. Muss ich den Wert der Ladestrategie ändern, bevor ich den Sichtbarkeitswert manipulieren kann? Denken Sie daran, dass ich im Moment auch keinen Staatsmanager verwende. – Jon

+0

Edit * Ich kann auf die Objekte zugreifen, wenn ich sie durch this.FindName finde, obwohl dies sehr hässlich erscheint, da ich jedes Mal eine neue Variable erfinden muss. könnte eine sauberere Lösung mit dem visuellen Zustandsmanager gefunden werden – Jon

Verwandte Themen