【问题标题】:fetch gridViewItem from a GridView from codeBehind UWP从 codeBehind UWP 的 GridView 中获取 gridViewItem
【发布时间】:2017-03-01 14:03:28
【问题描述】:

我正在开发一个 UWP 应用程序,尝试使用 GridView 而不是 HubSection 从平台示例中实现 Transform3DAnimations。除了获取GridViewItem 之外,我已经弄清楚了。下面的代码是从上下文中的示例到 hubsection。

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

【问题讨论】:

    标签: c# gridview uwp


    【解决方案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;
                }
            }
        }
    }
    

    【讨论】:

    • 在示例中,他们使用该方法获取hubsection当前视图中的项目,然后获取当前视图中的随机对象的容器,然后更改数据上下文。我不想获取存在选定事件或已被选定的对象的容器。在计时器滴答声中,我想在 gridview 的当前视图中获取项目,然后从它们中随机获取并获取其容器(类型为 gridviewitem),然后更新它的数据上下文。能否请你帮忙。抱歉我的格式我正在使用移动应用程序
    • 我试过你的代码,var container = AllDevicesGridView.ContainerFromItem(AllDevicesGridView.Items[1]); 确实返回了一个容器,但该容器的数据上下文为空。我错过了什么吗?
    • @AdityaSharma,如果您需要获取或更改项目的数据上下文,您可能需要从 GridViewItem 获取 ListViewItemPresenter 对象。我将更新代码以获取数据上下文。
    • 问个简单的问题,如果ListViewItemPresenter 的数据上下文发生更改,您使用ListViewItemPresenter 是否会引发GridViewItem 的OnViewModelPropertyChanged 事件?
    • @AdityaSharma 我不确定您的 OnViewModelPropertyChanged 是什么,但根据您的代码,sectionToUpdate.DataContext = new InappLiveTileViewModelModel(); 我认为您的意思是视图模型中的属性更改事件句柄。如果由于您创建了一个新的视图模型实例而不更新现有的视图模型实例,那么我认为它不会触发该事件。您没有更新绑定源只是当前项目的属性,只能更改当前项目。可以使用上面的代码,在事件上设置一个断点,看是否可以触发。
    猜你喜欢
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多