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

时间:2014-12-02 10:00:18

标签: c# xaml windows-runtime winrt-xaml windows-8.1

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

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

<Grid Width="160" Height="280" Visibility="{Binding IsHidden, Converter={StaticResource InvertedBooleanToVisibilityConverter}}">

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

enter image description here

关于如何解决它的任何想法?也许是相同的XAML样式编辑?

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

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

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

3 个答案:

答案 0 :(得分:5)

问题出在GridView&#39; ItemsPanel

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

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

更新GridView ItemsPanel后,您还有一件事要做。您还需要获取托管GridViewItem的{​​{1}}并将其Itemtemplate设置为Visibility

Collapsed

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

答案 1 :(得分:0)

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

我将您的点击处理程序更改为ds.RemoveAt(5);而不是隐藏该项目,并且使用漂亮的动画将该元素从视图中移除。这似乎是预期的,也是一个有趣的发现。

答案 2 :(得分:0)

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

  

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

您需要禁用容器并创建两个DataTemplate并使用DataTemplateSelector,您可以选择哪个DataTemplate用于禁用和活动项。 Check this useful article