Grid-或ListView中的不同对象类型

时间:2012-09-20 09:59:06

标签: c# xaml gridview grid microsoft-metro

我目前正在尝试弄清楚如何在GridView中显示不同类型的对象,例如查看此Pic:

右边的最后一个元素与其他元素不同,所以如果我将一个observablecollection绑定到GridView,我怎么能说最后一个元素以anohter布局显示。

目前我正在使用此XAML代码

<GridView x:Name="startView" ItemsSource="{Binding}" Grid.Column="1" Grid.Row="2" SelectionMode="None" Width="Auto">
                <GridView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock x:Name="DetailTitle" Height="74" Text="{Binding Title}" />
                            <Image x:Name="Image" Height="Auto" Width="Auto" Margin="0" Stretch="None" Source="{Binding LocalCoverUrl}" Visibility="Collapsed" />
                        </StackPanel>
                    </DataTemplate>
                </GridView.ItemTemplate>
                <GridView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapGrid Orientation="Horizontal" MaximumRowsOrColumns="2" />
                    </ItemsPanelTemplate>
                </GridView.ItemsPanel>
            </GridView>

以及后面的代码:

ObservableCollection<Movie> recentlyStarted = await Api.RecentlyStarted(3);
startView.DataContext = recentlyStarted;

但我目前还不知道如何让最后一个元素以不同的风格出现

2 个答案:

答案 0 :(得分:2)

简单的方法是将两种类型的对象作为不同的类(例如MoviePicStyle + MoviePlainStyle。然后将DataTemplate移出GridView,以便按类型拾取每个对象, e.g。

<Window.Resources>
  <DataTemplate DataType="{x:Type ViewModel:MoviePicStyle}">
    <StackPanel>
       <TextBlock x:Name="DetailTitle" Height="74" Text="{Binding Title}" />
       <Image x:Name="Image" Height="Auto" Width="Auto" Margin="0" Stretch="None" Source="{Binding LocalCoverUrl}" Visibility="Collapsed" />
    </StackPanel> 
  <DataTemplate DataType="{x:Type ViewModel:MoviePlainStyle}">
      ...Different View...
  </DataTemplate>
</Window.Resources>
<GridView...

答案 1 :(得分:0)

使用gridview的模板选择器属性,并根据对象的类型选择模板。我在我的项目中做了同样的事情。你需要编写自己的DataTemplateSelector。

我在下面提到了链接

http://babaandthepigman.wordpress.com/2012/02/08/datatemplateselector-winrt/