修改GridView中的最后(或单个)项

时间:2015-11-03 06:44:21

标签: c# windows-runtime windows-store-apps microsoft-metro winrt-xaml

我有GridViewObservableCollection填充(通过绑定)。如何设置它以便每次将新项添加到ObservableCollection时,GridView中的最后一项始终都有一个按钮?

这是GridView的ItemTemplate

的XAML
<GridView.ItemTemplate>
<DataTemplate>
    <Grid HorizontalAlignment="Left" Width="250" Height="250">
        <Border Background="White">
            <Image Source="{Binding ImagePath}" Stretch="UniformToFill" AutomationProperties.Name="{Binding Title}"/>
        </Border>
        <StackPanel VerticalAlignment="Bottom" Background="{ThemeResource ListViewItemOverlayBackgroundThemeBrush}">
            <TextBlock Text="{Binding Title}" Foreground="{ThemeResource ListViewItemOverlayForegroundThemeBrush}" Style="{StaticResource TitleTextBlockStyle}" Height="60" Margin="15,0,15,0"/>
            <TextBlock Text="{Binding DateMade}" Foreground="{ThemeResource ListViewItemOverlaySecondaryForegroundThemeBrush}" Style="{StaticResource CaptionTextBlockStyle}" TextWrapping="NoWrap" Margin="15,0,15,10"/>
        </StackPanel>
    </Grid>
</DataTemplate>
</GridView.ItemTemplate>

我的问题在于此模板应用于GridView中的所有项目。我想要它,以便如果它是 last 项目(并且每次添加新项目时最后一项都会不断更改),上面的StackPanel应该被另一个控件替换(例如,一个按钮)。我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

我会扩展所有元素的模板但隐藏附加元素,只有在它是最新元素时才会显示它(由某个bool属性指定,在最后一个元素上设置为true)。这样的事情。

<GridView.ItemTemplate>
<DataTemplate>
    <Grid HorizontalAlignment="Left" Width="250" Height="250">
        <Border Background="White">
            <Image Source="{Binding ImagePath}" Stretch="UniformToFill" AutomationProperties.Name="{Binding Title}"/>
        </Border>
        <Button Visibility="{Binding IsLastElement, Converter={StaticResource BoolToVisibilityConverter}}"/>
        <StackPanel VerticalAlignment="Bottom" Background="{ThemeResource ListViewItemOverlayBackgroundThemeBrush}">
            <TextBlock Text="{Binding Title}" Foreground="{ThemeResource ListViewItemOverlayForegroundThemeBrush}" Style="{StaticResource TitleTextBlockStyle}" Height="60" Margin="15,0,15,0"/>
            <TextBlock Text="{Binding DateMade}" Foreground="{ThemeResource ListViewItemOverlaySecondaryForegroundThemeBrush}" Style="{StaticResource CaptionTextBlockStyle}" TextWrapping="NoWrap" Margin="15,0,15,10"/>
        </StackPanel>
    </Grid>
</DataTemplate>
</GridView.ItemTemplate>

我认为另一个选择是使用TemplateSelecting事件动态更改DataTemplate,改变元素的内容,但这样做会更多。

但可能有更好的解决方案。

修改

决定分享上述想法的一些链接(我在WinRT中使用过)和另一个在WPF中可用的链接

WPF Based Dynamic DataTemplateSelector - 在WinRT中使用了类似的方法

DataTemplateSelector - 尝试稍加修改的示例并正常运行