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

Modify last (or individual) item inside GridView

我有一个 GridView,它由 ObservableCollection 填充(通过绑定)。我如何设置它以便每次向 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 应该被另一个控件替换(比如说,一个按钮)。我该怎么做?

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

<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 - 尝试稍微修改示例并正常工作