1

У меня есть GridView, который заполнен (через переплет) ObservableCollection. Как настроить его так, чтобы каждый раз, когда новый элемент добавляется к ObservableCollection, последний элемент в GridView всегда имеет кнопку поверх него?Изменить последний (или отдельный) элемент внутри GridView

Это XAML из ItemTemplate в GridView в

<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 следует заменить другим элементом управления (например, кнопкой). Как мне это сделать?

ответ

1

Я хотел бы расширить шаблон всех элементов, но скрыть дополнительный элемент и показать его только в том случае, если это последний элемент (указанный некоторым свойством bool, для которого задан 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 событие, при изменении содержания элементов, но это было бы немного больше работы.

Однако могут быть лучшие решения.

Редактировать

Решил поделиться некоторыми ссылки для вышеупомянутой идеи (которые я использовал в WinRT) и еще один доступный в WPF

WPF Based Dynamic DataTemplateSelector - используется аналогичный подход в WinRT

DataTemplateSelector - пробовал слегка модифицированный пример и отлично работает