当组为空时,语义缩放控制抛出异常

时间:2012-03-31 02:49:25

标签: windows-8 microsoft-metro windows-runtime

在应用程序中有一个语义缩放控件,我有三个组(今天,明天和更晚),但这些组不一定总是至少有一个项目。当所有三个组都是非空的时,语义缩放控制工作完美,但是当任何项都为空时,语义缩放控制不起作用。我已经尝试清除我的DataTemplate以确保它与绑定无关,我找不到要挂钩的事件,以便我可以逐步完成触发缩小事件时发生的事情。

有没有人有这个工作,或有任何想法/建议/提示/解决方法?


一些代码:

XAML - collectionviewsource:

        <!-- Collection of grouped items displayed by this page -->
    <CollectionViewSource
        x:Name="groupedItemsViewSource"
        Source="{Binding Groups}"
        IsSourceGrouped="True"
        ItemsPath="Items"
        d:Source="{Binding ItemGroups, Source={d:DesignInstance Type=data:AuctionDataSource, IsDesignTimeCreatable=True}}"/>

XAML - 语义缩放控制:

<SemanticZoom Visibility="Collapsed" Grid.Row="1" Name="MainSemanticZoom">
        <SemanticZoom.ZoomedInView>
            <GridView
            x:Name="itemGridView"
            AutomationProperties.AutomationId="ItemGridView"
            AutomationProperties.Name="Grouped Items"
            Margin="116,0,40,46"
            ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"

            SelectionMode="Multiple"                  
            SelectionChanged="itemGridView_SelectionChanged_1">
                <GridView.ItemTemplate>
                    <DataTemplate>
                        <Grid HorizontalAlignment="Left" Width="250" Height="200" RightTapped="Grid_RightTapped_1" Tag="{Binding}">

                            <Border  Background="{StaticResource ListViewItemPlaceholderRectBrush}">
                                <Image Source="{Binding Image}" Stretch="UniformToFill"/>
                            </Border>

                            <StackPanel Grid.Column="1"  VerticalAlignment="Bottom" Background="{StaticResource ListViewItemOverlayBackgroundBrush}">
                                <!--bindings: Title , CurrentBid, CloseDate -->
                                <TextBlock Text="{Binding Title}" Foreground="{StaticResource ListViewItemOverlayTextBrush}" Height="20" Style="{StaticResource TitleTextStyle}" Margin="15,0,15,0"/>
                                <TextBlock Text="{Binding CurrentBid, Converter={StaticResource FormatStringConverter}, ConverterParameter='\{0:C}'}" Foreground="{StaticResource ListViewItemOverlayTextBrush}" Style="{StaticResource TitleTextStyle}" TextWrapping="NoWrap" Margin="15,0,15,0"/>
                                <TextBlock Text="{Binding CloseDate, Converter={StaticResource FriendlyTimeConverter}}" Foreground="{StaticResource ListViewItemOverlayTextBrush}" Style="{StaticResource CaptionTextStyle}" TextWrapping="NoWrap" Margin="15,0,15,10"/>

                                <Border Visibility="{Binding IsLeading, Converter={StaticResource BooleanToVisibilityConverter}}" Name="leadingBlock" Background="CadetBlue">
                                    <TextBlock Text="leading" Style="{StaticResource BodyTextStyle}" Margin="15,0,15,10"></TextBlock>
                                </Border>
                                <Border Visibility="{Binding IsOutbid,Converter={StaticResource BooleanToVisibilityConverter}}" Name="outbidBlock" Background="Orange">
                                    <TextBlock Text="outbid" Style="{StaticResource BodyTextStyle}" Margin="15,0,15,10"></TextBlock>
                                </Border>
                                <Border Visibility="{Binding NoBids,Converter={StaticResource BooleanToVisibilityConverter}}" Name="noBidsBlock" Background="Gray">
                                    <TextBlock Text="you have not placed a bid" Style="{StaticResource BodyTextStyle}" Margin="15,0,15,10"></TextBlock>
                                </Border>
                            </StackPanel>
                        </Grid>
                    </DataTemplate>
                </GridView.ItemTemplate>

                <GridView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel Orientation="Horizontal"/>
                    </ItemsPanelTemplate>
                </GridView.ItemsPanel>
                <GridView.GroupStyle>
                    <GroupStyle>
                        <GroupStyle.HeaderTemplate>
                            <DataTemplate>

                                <Grid Margin="5,0,30,10">
                                    <!--<Button                                        
                                    AutomationProperties.Name="Group Title"
                                    Content="{Binding Title}"
                                    Click="Header_Click"
                                    Style="{StaticResource TextButtonStyle}"/>-->
                                    <TextBlock Text="{Binding Title}" Style="{StaticResource SubheaderTextStyle}"></TextBlock>
                                </Grid>
                            </DataTemplate>
                        </GroupStyle.HeaderTemplate>
                        <GroupStyle.Panel>
                            <ItemsPanelTemplate>
                                <VariableSizedWrapGrid Orientation="Vertical" Margin="0,0,80,0"/>
                            </ItemsPanelTemplate>
                        </GroupStyle.Panel>
                    </GroupStyle>
                </GridView.GroupStyle>
            </GridView>
        </SemanticZoom.ZoomedInView>
        <SemanticZoom.ZoomedOutView>
            <GridView 
            x:Name="itemZoomOutGridView"
            AutomationProperties.AutomationId="ItemZoomOutGridView"
            AutomationProperties.Name="Grouped Items"                                
                SelectionMode="None">
                <GridView.ItemTemplate>
                    <DataTemplate>
                        <Grid HorizontalAlignment="Left">

                            <Border Background="{StaticResource ListViewItemPlaceholderRectBrush}">
                                <Image Height="750" Source="{Binding Group.Image}" Stretch="UniformToFill"/>
                            </Border>

                            <StackPanel Height="140" Width="400" Background="Orange" VerticalAlignment="Center">                                    
                                <TextBlock Margin="15" Text="{Binding Group.Title}" Foreground="White" Style="{StaticResource HeaderTextStyle}"></TextBlock>
                                <TextBlock Margin="15" Grid.Row="1" Text="{Binding Group.Items.Count}" Foreground="White" Style="{StaticResource HeaderTextStyle}"/>
                            </StackPanel>
                        </Grid>
                    </DataTemplate>
                </GridView.ItemTemplate>

                <GridView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapGrid Margin="230,0,0,0" Width="2000" Orientation="Horizontal"/>
                    </ItemsPanelTemplate>
                </GridView.ItemsPanel>
            </GridView>
        </SemanticZoom.ZoomedOutView>
    </SemanticZoom>

2 个答案:

答案 0 :(得分:5)

我通过处理SemanticView控件的ViewChangeStarted和ViewChangeCompleted事件来“解决”这个问题。在ViewChangeStarted事件中,我添加了一个新项,因此该组不会为空,并且在ViewChangedCompleted事件中我将其删除。这不是一个修复,只是一种解决方法,但它确实起到了作用。

答案 1 :(得分:1)

我不认为这是SemanticZoom的问题。我们报告了GridView与分组源非常相似的问题。如果任何一组都是空的,我们就会遇到异常。事实上,CollectionViewSource可能是其中的罪魁祸首。

我们的解决方案是不使用GridView进行分组。您可以将ItemsControl配置为与分组的GridView类似。唯一的缺点是你不能同时从不同的组中选择项目,但对我们来说这不是问题,因为我们不需要选择。