2017-03-01 58 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'对象。我将更新代码以获取数据上下文。 –