1

我有一个GridView,它由ObservableCollection填充(通过绑定)。如何设置它,以便每次将新项目添加到ObservableCollection时,GridView中的最后一项始终在其上有一个按钮?修改GridView中的最后(或个别)项目

这是正在申请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> 

我的问题所在。我希望如果它是最后项目(并且最后一个项目会在每次添加新项目时保持更改),则上述StackPanel应该由另一个控件(例如按钮)替换。我会如何去做这件事?

回答

1

我会扩展所有元素的模板,但隐藏附加元素,并只显示它是否是最新元素(由最后一个元素上设置为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> 

我认为其他选项是改变的DataTemplate动态使用TemplateSelecting事件,变化的元素的内容,但它会多一点的工作。

虽然可能有更好的解决方案。

编辑

决定分享了上述想法在WPF

WPF Based Dynamic DataTemplateSelector提供一些链接(这是我在WinRT中已经使用),另一种 - 在WinRT中

使用类似的方法DataTemplateSelector - 试过稍微修改的例子,并且工作正常