如何在网格视图中显示网格视图?

时间:2014-03-25 09:52:36

标签: xaml windows-8 windows-runtime winrt-xaml

我正在开发一个Windows 8应用程序。我想在另一个GridView项目模板中显示GridView。我已经在内部GridView中添加了可见性绑定,但是在外部GridViewItems中包装GridView时绑定不起作用。当我使用简单的ListViewGridView而没有任何包装时,它可以正常工作。

这是包装

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

“MyFeedGridView”的样式,其中包含另一个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。以下是我正在使用的转换器

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

1 个答案:

答案 0 :(得分:0)

GridView的问题在于默认情况下它的所有GridViewItems使用相同的大小。您可以使用VariableSizedWrapGrid作为其ItemsPanel,但这会禁用虚拟化,因此您将无法使用包含大量项目的GridView(超过几十项) )而不会产生性能成本。

对于您的方案,您可以使用GridView与非统一ItemsSource - 其中一些项目代表主要列表项目,一些项目代表歌曲列表并使用ItemTemplateSelector指定要用于哪种类型的项目的模板。它当然不是理想的,但这是你最简单的选择。一个问题是,这些歌曲列表中的某些列表可能会在与其关联的项目不同的列中孤立,因此对于丑陋的解决方法,您可能需要计算每列的项目数量,并且在列表中还包括空项目或重新排列项目,以便空列结束项目填充没有与之关联的任何歌曲列表的项目。

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