如何在应用程序运行时更改GridView.ItemTemplate?

时间:2014-06-02 18:12:22

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

在我的应用程序中,我有使用GridView和ComboBox的页面。我想根据ComboBox中的选定项更改GridView.ItemTemplate属性。我该如何实施呢?

不过,我知道this question,但它已经很老了,看起来不像“最佳做法”。 (ui控件的可见性/不可见性如何影响cpu / gpu负载?)

我的GridView:

<GridView x:Name="gridViewMain" Grid.Row="1" SelectionMode="None" IsItemClickEnabled="True"
              ItemsSource="{Binding CurrentList}" ItemTemplate="{StaticResource gridViewMainItemTemplate}"
              Loaded="gridViewMain_Loaded" LayoutUpdated="gridViewMain_LayoutUpdated">
        <interactivity:Interaction.Behaviors>
            <core:EventTriggerBehavior EventName="ItemClick">
                <core:CallMethodAction MethodName="GridViewClick"
                                       TargetObject="{Binding Mode=OneWay}" />
            </core:EventTriggerBehavior>
        </interactivity:Interaction.Behaviors>
    </GridView>

我的一个模板:

<DataTemplate x:Key="gridViewMainItemTemplate">
        <Grid x:Name="gridATemplate" Width="185" Height="288">
            <Image x:Name="imgATemplate" Source="{Binding image_url}" Stretch="UniformToFill"
                   HorizontalAlignment="Center" VerticalAlignment="Center" />
            <Grid Background="{ThemeResource ListViewItemOverlayBackgroundThemeBrush}" VerticalAlignment="Bottom">
                <Grid.RowDefinitions>
                    <RowDefinition />
                    <RowDefinition />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <TextBlock x:Name="textBlockTitle" Text="{Binding title}"
                           TextWrapping="Wrap" Style="{StaticResource BodyTextBlockStyle}" Margin="5,0,0,0"
                           Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Foreground="White" FontWeight="Bold"
                           MaxHeight="50" />
                <TextBlock x:Name="textBlockType" TextWrapping="Wrap" Style="{StaticResource BodyTextBlockStyle}"
                           Margin="5,0,0,0"
                           Grid.Column="0" Grid.Row="1" Foreground="White" Text="{Binding type}" FontWeight="Bold" />
                <StackPanel Grid.Row="1" Grid.Column="1" Orientation="Horizontal">
                    <TextBlock x:Name="textBlockProgressL" TextWrapping="Wrap"
                               Style="{StaticResource BodyTextBlockStyle}" FontWeight="Bold" Foreground="White"
                               Text="Progress:" />
                    <TextBlock x:Name="textBlockProgressV" TextWrapping="Wrap"
                               Style="{StaticResource BodyTextBlockStyle}" FontWeight="Bold" Foreground="White"
                               Text="{Binding watched_episodes}" Margin="10,0,0,10" />
                </StackPanel>
            </Grid>
        </Grid>
    </DataTemplate>

2 个答案:

答案 0 :(得分:2)

当然可以这样做!在XAML中,您可以做任何事情。你不能做的是在不重新渲染的情况下即时更改模板。请记住,这就像告诉您的打印机使用卡片纸一样。它会服从。如果您更改设置以使用笔记本纸,它也会遵守。您只需再次打印,因为它已经打印在卡片纸上。

有几种方法可以重新渲染GridView。一种方法是离开页面并导航回来。在你的场景中听起来并不理想。在您的场景中,您只需要重置正在使用的ObservableCollection。像这样:

void Reset<T>(ObservableCollection<T> collection)
{
    var original = collection.ToArray();
    collection.Clear();
    foreach (var item in original)
        collection.Add(item);
}

祝你好运!

答案 1 :(得分:1)

您想要使用datatemplateselector

http://blogs.msdn.com/b/bryanbolling/archive/2012/12/08/how-to-control-the-datatemplateselector-in-windows-store-apps.aspx

您可以创建多个项目模板,并根据任何条件选择要显示的模板。

每当选择发生变化时,您都必须刷新gridview。