【问题标题】:Modify last (or individual) item inside GridView修改 GridView 中的最后一个(或单个)项目
【发布时间】:2015-11-03 06:44:21
【问题描述】:

我有一个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 应该被另一个控件替换(比如,一个按钮)。我该怎么做呢?

【问题讨论】:

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


    【解决方案1】:

    我会扩展所有元素的模板,但隐藏附加元素并仅在它是最新元素时显示它(由在最后一个元素上设置为 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 - 尝试了稍微修改的示例并且工作正常

    【讨论】:

      猜你喜欢
      • 2016-03-17
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      相关资源
      最近更新 更多