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