2017-03-01 1 views
0

Ich arbeite an einer UWP-Anwendung, die versucht, die Transform3DAnimations aus den Plattform-Beispielen mit einer GridView anstelle einer HubSection zu implementieren. Ich habe alles herausgefunden außer dem Holen der GridViewItem. Der folgende Code stammt aus dem Beispiel im Zusammenhang mit einem Hubabschnitt.find gridViewItem von einem GridView von codeBehind UWP

private void UpdateRandomSection() 
    { 
     // Updating the section triggers a cool animation! 
     // See SectionView.xaml and SectionView.xaml.cs 

     var sectionsInView = HeadlinesHub.SectionsInView; 
     var sectionsCount = sectionsInView.Count; 

     if (sectionsCount > 0) 
     { 
      var sectionToUpdate = sectionsInView[_random.Next(sectionsCount)]; 
      sectionToUpdate.DataContext = new HeroArticlesViewModel(); 
     } 
    } 

Ich versuche, die GridViewItem zu holen, aber ich bin nicht in der Lage, die GridViewItem es gibt mir immer das Datenmodell der GridViewItem zu holen. Wie kann ich die GridViewItem von der GridView bekommen? Mein Code ist unten:

private Random InAppLiveTileRandomTileNumberGenerator; 
private void UpdateRandomSection() 
    { 
     var sectionsInView = AllDevicesGridView.Items; 
     var sectionsCount = sectionsInView.Count; 

     if (sectionsCount > 0) 
     { 
      var sectionToUpdate = (GridViewItem)AllDevicesGridView.Items[InAppLiveTileRandomTileNumberGenerator.Next(sectionsCount)]; //Invalid Cast exception here 
      sectionToUpdate.DataContext = new InappLiveTileViewModelModel(); 
     } 
    } 

Link to the sample

Solution I tried from stack answers

Antwort

1

Für Ihre Codezeile var sectionToUpdate = (GridViewItem)AllDevicesGridView.Items[InAppLiveTileRandomTileNumberGenerator.Next(sectionsCount)]; wird es liefert das Datenmodell des GridViewItem wie Sie gesehen. Um die GridViewItem zu erhalten, müssen Sie möglicherweise ContainerFromItem Methode verwenden. Zum Beispiel, wenn Sie das GridViewItem Objekt aus dem gewählten Artikel Code erhalten möchten wie folgt:

private void listViewDirectory_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{   
    var container = AllDevicesGridView.ContainerFromItem(AllDevicesGridView.SelectedItem); 
    GridViewItem item = container as GridViewItem; 
    System.Diagnostics.Debug.WriteLine(item.ActualHeight); 
} 

Es scheint, wie Sie ein spezielles Element mit Element-Index erhalten möchten zugeordnet:

var container = AllDevicesGridView.ContainerFromItem(AllDevicesGridView.Items[1]); 
GridViewItem item = container as GridViewItem; 

Wenn Sie möchten Datenkontext der GridViewItem erhalten, müssen Sie möglicherweise die ListViewItemPresenter von GridViewItem bekommen. Hier verwende ich die VisualTreeHelper, um die ListViewItemPresenter zu bekommen. Übrigens, VisualTreeHelper wird nicht empfohlen, es sei denn, Sie haben keine anderen Möglichkeiten.

private void listViewDirectory_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    var container = AllDevicesGridView.ContainerFromItem(AllDevicesGridView.Items[1]); 
    GridViewItem item = container as GridViewItem; 
    ListViewItemPresenter itempresenter; 
    IEnumerable<ListViewItemPresenter> items = FindVisualChildren<ListViewItemPresenter>(item); 
    int count = items.Count(); 
    itempresenter = items.ElementAt<ListViewItemPresenter>(0);   
    itempresenter.DataContext = new Person() { Name = "update", Contact = "update" }; 
} 
private static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
{ 
    if (depObj != null) 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
      if (child != null && child is T) 
      { 
       yield return (T)child; 
      } 

      foreach (T childOfChild in FindVisualChildren<T>(child)) 
      { 
       yield return childOfChild; 
      } 
     } 
    } 
} 
+0

Im Beispiel verwenden sie die Methode die Elemente in der aktuellen Ansicht der hubsection zu bekommen und dann den Behälter für ein zufälliges Objekt erhalten, die in der aktuellen Ansicht ist, und dann den Datenkontext ändern. Ich möchte nicht den Container des Objekts abrufen, auf dem sich ein ausgewähltes Ereignis oder ein ausgewähltes Ereignis befindet. Bei einem Timer-Tick möchte ich die Elemente in der aktuellen Ansicht der Gridview holen und dann ein zufälliges von ihnen holen und seinen Container (vom Typ gridviewitem) holen und dann den Datenkontext aktualisieren. Kannst du bitte helfen. Entschuldigung für meine Formatierung Ich verwende die mobile App –

+0

Ich habe Ihren Code versucht, die 'var container = AllDevicesGridView.ContainerFromItem (AllDevicesGridView.Items [1]);' 'gibt mir einen Container, aber der Datenkontext des Containers ist null. Fehle ich etwas? –

+0

@AdityaSharma, wenn Sie den Datenkontext des Elements abrufen oder ändern müssen, müssen Sie möglicherweise das Objekt 'ListViewItemPresenter' aus dem' GridViewItem' abrufen. Ich werde den Code aktualisieren, um den Datenkontext zu erhalten. –

Verwandte Themen