2017-03-01 57 views
0

我正在嘗試使用GridView而不是HubSection從嘗試實現Transform3DAnimations的平臺樣本實現的UWP應用程序。除了取得GridViewItem之外,我已經明白了。下面的代碼是從上下文中的示例到hubsection。從代碼隱藏的GridView中獲取gridViewItem 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(); 
     } 
    } 

我試圖獲取GridViewItem,但我無法獲取它總是返回我GridViewItem的數據模型GridViewItem。如何從GridView獲得GridViewItem?我的代碼如下:

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

回答

1

爲您的代碼行var sectionToUpdate = (GridViewItem)AllDevicesGridView.Items[InAppLiveTileRandomTileNumberGenerator.Next(sectionsCount)];它會返回你看到的GridViewItem的數據模型。要獲得GridViewItem,您可能需要使用ContainerFromItem方法。例如,如果你想從所選擇的項目代碼得到GridViewItem對象可能如下:

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); 
} 

好像你想獲得與商品指數某個特殊項目分配:

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

如果您想要獲得GridViewItem的數據上下文,則可能需要從GridViewItem獲取ListViewItemPresenter。這裏我使用VisualTreeHelper來獲得ListViewItemPresenter。順便說一句,VisualTreeHelper不建議使用,除非你沒有其他的方法。

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

在示例中,他們使用該方法獲取hubsection當前視圖中的項目,然後獲取當前視圖中隨機對象的容器,然後更改數據上下文。我不想獲取有選定事件或已被選擇的對象的容器。在計時器滴答聲上,我想獲取gridview的當前視圖中的項目,然後從它們中獲取一個隨機數並獲取它的容器(類型爲gridviewitem),然後更新它的數據上下文。能否請你幫忙。對不起,我正在使用移動應用程序 –

+0

我試過了你的代碼,var container = AllDevicesGridView.ContainerFromItem(AllDevicesGridView.Items [1]);'確實返回了一個容器,但該容器的數據上下文爲空。我錯過了什麼嗎? –

+0

@AdityaSharma,如果您需要獲取或更改項目的數據上下文,您可能需要從'GridViewItem'獲取'ListViewItemPresenter'對象。我將更新代碼以獲取數據上下文。 –