我有一个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
中存在间隙。
关于如何解决它的任何想法?也许是相同的XAML样式编辑?
以下是重现问题的最小解决方案:https://dl.dropboxusercontent.com/u/73642/gv.zip
我尝试将项目的宽度和高度绑定到隐藏标志,并在隐藏项目时将其设置为0,但它没有帮助,仍然是GridView
中的间隙。
更新:一种解决方法是过滤实际的绑定集合,但由于某些业务需求,这是不可能的。
答案 0 :(得分:5)
问题出在GridView
&#39; ItemsPanel
。
ItemsWrapGrid
和WrapGrid
都是统一网格。他们所有的子元素将共享相同的高度和宽度。这就是为什么即使你折叠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。