2016-04-13 5 views
1

Ich versuche, mehrere PivotItems dynamisch im C# -Ende zu erstellen und dann für jedes PivotItem den Inhalt als GridView festzulegen, der eine Datatemplate enthält, in der Elemente dynamisch gebunden sind.Wie man eine GridView von PageResource zu einem PivotItem dynamisch in UWP hinzufügt?

XAML-Code:

<Page.Resources> 
<GridView x:Key="pivoteItemGV" 
    Margin="18,10,0,0" 
    Background="#191919" 
    SelectionMode="None"> 
    <GridView.ItemContainerStyle> 
     <Style TargetType="GridViewItem"> 
      <Setter Property="HorizontalContentAlignment" Value="Center"/> 
      <Setter Property="VerticalContentAlignment" Value="Top"/> 
     </Style> 
    </GridView.ItemContainerStyle> 
    <GridView.ItemTemplate> 
     <DataTemplate> 
      <StackPanel MaxWidth="300"> 
       <TextBlock x:Name="ItemNameTB" Text="{Binding ItemName}"/> 
       <TextBlock x:Name="ItemDescriptionTB" Text="{Binding ItemDescription}" 
          TextWrapping="WrapWholeWords"/> 
       <TextBlock x:Name="ItemPriceTB" Text="{Binding ItemPrice}" /> 
      </StackPanel> 
     </DataTemplate> 
    </GridView.ItemTemplate> 
</GridView> 
</Page.Resources> 

Und auf der C# Ende

private void BindTheContentToPage() 
{ 
    foreach(var categoryItem in contentResourceDictionary) 
    { 
     PivotItem categoryPivotItem = new PivotItem(); 
     categoryPivotItem.Header = categoryItem.Key; 
     GridView gv = this.Resources["pivoteItemGV"] as GridView; 
     categoryPivotItem.Content = gv; 
     categoryPivotItem.DataContext = categoryItem.Value; 
     mainContentPivot.Items.Add(categoryPivotItem); 
    } 
} 

Die App stürzt bei categoryPivotItem.Content = gv;Wert besagt, fällt nicht innerhalb des erwarteten Bereichs.

Was mache ich richtig? Da ich nicht sicher bin, ob mehrere Kopien von Page.Resource-Inhalten vorliegen, wird GridView in diesem Fall dupliziert.

Vielen Dank für die Hilfe im Voraus.

Antwort

2
  1. Setzen Sie keine visuellen Elemente direkt in den Abschnitt Resources, wie Sie es getan haben. Sie können DataTemplate s dort setzen.
  2. Sie müssen die PivotItem.ContentTemplate Eigenschaft auf einige DataTemplate setzen. Setzen Sie die Eigenschaft PivotItem.Content auf Ihr Datenobjekt, an das Sie binden möchten.

XAML-Code:

<Page.Resources> 
<DataTemplate x:Key="pivoteItemGVTemplate"> 
    <GridView 
    ItemsSource="{Binding}" 
    Margin="18,10,0,0" 
    Background="#191919" 
    SelectionMode="None"> 
    <GridView.ItemContainerStyle> 
     <Style TargetType="GridViewItem"> 
      <Setter Property="HorizontalContentAlignment" Value="Center"/> 
      <Setter Property="VerticalContentAlignment" Value="Top"/> 
     </Style> 
    </GridView.ItemContainerStyle> 
    <GridView.ItemTemplate> 
     <DataTemplate> 
      <StackPanel MaxWidth="300"> 
       <TextBlock x:Name="ItemNameTB" Text="{Binding ItemName}"/> 
       <TextBlock x:Name="ItemDescriptionTB" Text="{Binding ItemDescription}" 
          TextWrapping="WrapWholeWords"/> 
       <TextBlock x:Name="ItemPriceTB" Text="{Binding ItemPrice}" /> 
      </StackPanel> 
     </DataTemplate> 
    </GridView.ItemTemplate> 
    </GridView> 
</DataTemplate> 
</Page.Resources> 

Und in # Code-Behind C:

private void BindTheContentToPage() 
{ 
    foreach(var categoryItem in contentResourceDictionary) 
    { 
     PivotItem categoryPivotItem = new PivotItem(); 
     categoryPivotItem.Header = categoryItem.Key; 
     var template = this.Resources["pivoteItemGVTemplate"] as DataTemplate; 
     categoryPivotItem.ContentTemplate = template; 
     categoryPivotItem.Content = categoryItem.Value; 
     mainContentPivot.Items.Add(categoryPivotItem); 
    } 
} 

Wenn Ihr categoryItem.Value eine Liste von Datenobjekten ist, dann ein Attribut Gridview hinzufügen (wie ich tat in der XAML):

ItemsSource="{Binding}" 
+0

Das ist, was ich suche. Aber es gibt hier ein Problem: Sie weisen der Inhaltsvorlage ein Datamaplate zu, aber es gibt keinen Inhalt, da mein category.value keine visuellen Elemente enthält. Versucht dieses, aber es zeigt nicht meine Inhalte an – AbsoluteSith

+0

Vielleicht liegt das daran, dass Sie die ItemsSource Ihrer GridView nicht gesetzt haben. Wenn Ihr categoryItem.Value eine Liste von Datenobjekten ist, fügen Sie der GridView ein Attribut hinzu: ItemsSource = "{Binding}". Ich habe die Antwort mit dieser neuen Zeile bearbeitet – Artemious

+0

Ja das war es! Danke für Ihre Hilfe! – AbsoluteSith