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

本文关键字:单个 最后一个 GridView 修改 | 更新日期: 2023-09-27 18:20:15

我有一个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中的所有项。我希望它是最后一个项目(每次添加新项目时,最后一个项目都会不断更改),上面的StackPanel应该被另一个控件(比如按钮)取代。我该怎么做?

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

我会扩展所有元素的模板,但隐藏额外的元素,并且只在它是最新的元素时显示它(由在最后一个元素上设置为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的动态数据模板选择器-在WinRT 中使用类似方法

DataTemplateSelector-尝试了一个稍微修改过的示例,并且运行良好