在Windows 8.1 GridView中未显示Visibility = Collapsed的项目

我有一个Windows 8.1应用程序,其GridView绑定到自定义(可排序,重复数据删除)可观察集合。 在这个集合中,我做了一些重过滤并为每个项目设置了一个IsHidden标志。

在项目的数据模板中,如果IsHidden标志设置为true,则存在使项目折叠的条件。

  

此方法适用于Windows Phone 8.1 XAML,使项目从ListView消失,但它在Windows 8.1 GridView不起作用。 Windows 8.1的问题在于,当我将集合中的项目设置为隐藏时,id会从GridView消失,但会留下一个空位,因此GridView存在间隙。

在此处输入图像描述

关于如何解决它的任何想法? 也许相同的XAML风格编辑?

以下是重现问题的最小解决方案: https : //dl.dropboxusercontent.com/u/73642/gv.zip

我尝试将项目的宽度和高度绑定到隐藏标志,并在隐藏项目时将其设置为0,但它没有帮助,仍然是GridView的间隙。

更新 :一种解决方法是过滤实际的绑定集合,但由于某些业务需求,这是不可能的。

问题出在GridViewItemsPanel

ItemsWrapGridWrapGrid都是统一网格。 他们所有的子元素将共享相同的高度和宽度。 这就是为什么即使你折叠了ItemTemplate ,空间仍然是保留的。

你真正需要的是一个WrapPanel 。 WINRT没有内置的WrapPanel但是Jerry Nixon已经构建了一个,你可以从这里获取它。

更新GridViewItemsPanel ,还有一件事要做。 您还需要获取承载ItemtemplateGridViewItem并将其Visibility设置为Collapsed

  private async void Button_Click(object sender, RoutedEventArgs e) { ds[5].IsHidden = true; await Task.Delay(1000); var gridViewItem =(GridViewItem)this.gv.ContainerFromIndex(5); gridViewItem.Visibility = Visibility.Collapsed; } 

我稍微延迟了一下,使崩溃更加明显。

我尝试了您的示例解决方案,并将其更改为ListView。 当网格本身被隐藏时,它表现出相同的行为。 我没有XAML Spy来validation,但似乎任何基于List的控件都会为列表中的每个项目分配一个渲染项目。

我将你的点击处理器更改为ds.RemoveAt(5); 而不是隐藏项目,并从一个漂亮的动画中删除元素。 这似乎是预期的,也是一个有趣的发现。

我需要花很多时间来理解这个问题,并且解决方案就在眼前。 您试图隐藏项目本身但容器仍在那里,当您将项目添加到GridView时,该项目将包装在项目容器中。 来自msdn:

“当您将项目添加到ItemsControl时,该项目将包装在项目容器中。例如,添加到ListView的项目将包装在ListViewItem中。如果没有UI虚拟化,整个数据集将保留在内存和项目容器中也为数据集中的每个项目创建。一个绑定到1000个项目的集合的ListView也将创建存储在内存中的1000个ListViewItem容器。“

您需要禁用容器并创建两个DataTemplate并使用DataTemplateSelector,您可以选择哪个DataTemplate用于禁用和活动项。 查看这篇有用的文章 。