2014-03-25 165 views
0

我正在开发一个Windows 8应用程序。我想在另一个GridView项目模板中显示GridView。并且我添加了对内部GridView的可见性绑定,但在将外部GridView包装为GridViewItems时绑定不起作用。它适用于当我使用简单的ListViewGridView没有任何包装。如何在网格视图内显示网格视图?

这是主要的GridView与包装

<GridView 
    Name="feedGridView" 
    Background="Transparent" 
    SelectionMode="None" 
    ItemTemplate="{StaticResource MyFeedGridView}"> 
    <GridView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VariableSizedWrapGrid Height="600" Orientation="Vertical" /> 
     </ItemsPanelTemplate> 
    </GridView.ItemsPanel> 
</GridView> 

的风格包含另一个GridView

<DataTemplate x:Key="MyFeedGridView"> 
    <Grid HorizontalAlignment="Left" Width="500">     
     <StackPanel x:Name="gridViewStackPanel" Orientation="Horizontal" > 
      <GridView 
       HorizontalAlignment="Right" 
       x:Name="myFeedGridViewInListView" 
       ItemTemplate="{StaticResource MyFeedGridViewInListView}" 
       ItemsSource="{Binding listContent}" 
       Height="100" 
       Visibility="{Binding listContent,Converter={StaticResource FeedListToVisibilityConverter}}" 
       SelectionMode="None" 
       Width="400" /> 
     </StackPanel> 
    </Grid> 
</DataTemplate> 

我使用一个转换器可以隐藏或显示内GridView“MyFeedGridView”。以下是我使用

public object Convert(object value, Type targetType, object parameter, string language) 
{ 
    List<ContentList> contents = value as List<ContentList>; 

    return (contents != null && contents.Count > 0) ? Visibility.Visible : Visibility.Collapsed; 
} 

我的问题的转换器是内部的GridView获取隐藏所有项目或获取的所有项目,不论我已绑定了listContent的可见。

我注意到,只有当我设置ItemsPanel时才会发生这种情况。如果我删除VariableSizedWrapGrid属性,那么它按预期工作。但是我需要在每一列之后包装这些项目,所以我不能废除它。

请让我知道,如果你有任何线索为什么发生这种情况。

由于

编辑: 附加的网格视图项目应如何排列图像。如果您看到网格视图的第一个项目,那么它在表示歌曲的网格视图项目内有另一个网格视图。所以这个内部网格视图对于一些项目将是空的,并为一些项目填充。所以我写了一个可视化转换器来显示和隐藏内部网格视图。当使用转换器时,如果第一个网格视图项目具有内部网格视图项目(歌曲,那么它将显示所有项目的内部网格视图,并且如果第一个网格视图项目没有任何内部网格视图项目(歌曲),那么它隐藏所有的主要网格视图项目内部网格视图。

让我知道,如果它不明确。enter image description here

+0

您能详细阐述一下您试图实现什么以及您的视图模型是如何构建的?也许你可以画出你的'GridViewItems'的方框和你想要它们包装的方向和顺序? –

+0

@FilipSkakun我已添加图片。如果不清楚,请告诉我。 – user3458865

回答

0

GridView的问题是,它同样采用了尺寸为所有GridViewItems默认情况下,你可以使用VariableSizedWrapGrid作为其ItemsPanel,但这将禁用虚拟化,因此您将无法将GridView与大量项目(超过几十个)一起使用,而不会导致性能成本。

为了您的情况下,你可以使用一个GridView具有非均匀ItemsSource - 一个地方的一些项目的主要代表列表项和一些代表的歌曲列表,并使用ItemTemplateSelector指定要使用哪种类型的项目的模板。这当然不是理想的,但这是你最简单的选择。一个问题是,这些歌曲列表中的一部分最终可能会在与它们相关联的项目不同的列中成为孤儿,因此,对于难以找到的解决方法,您可能需要计算出每列中的项目数量,并且列表中还包含空项目或重新排列项目,以便空栏末项目填充没有与它们相关联的任何歌曲列表的项目。

一个更好的选择可能是使用一个VariableSizedWrapGrid作为ItemsSource或简单地使用手动填充Grid,并在打开一个ListView末增加more...项目,因为垂直列表恕我直言比水平GridViews容易滚动。你仍然需要使用非统一的ItemsSourceItemTemplateSelector来获得所需的布局并保持列表的虚拟化,但这就是你所得到的。