1

C#/XAML を使用して Windows ストア アプリの開発に取り組んでいます。私は主に iOS の経験があり、Android アプリの開発はある程度経験していますが、C#/XAML の世界にはまだ慣れていません。

これがGridViewベースのページでの私の問題です(VS2012が生成する素敵なテンプレートに基づいています)。

グリッドビューがあり、そのコレクションはネットワークから取得したデータにバインドされており、正常に動作します。しかし、データに応じてグリッド項目を変更したい。例: さまざまなグリッド ビュー アイテムを使用して表示したいファイルとフォルダーがあります。

私の質問: データに応じて ItemTemplate に異なる DataTemplate を使用するにはどうすればよいですか? たとえば、「フォルダー」の場合、垂直方向に中央揃えのテキストブロックが 1 つだけあり、ファイルの場合、2 つのテキストブロックがあり、視覚的に異なります。

私は正しい道を進んでいますか、それともまったく違う道を歩むべきですか?

XAML 部分は

<GridView
            x:Name="itemGridView"
            AutomationProperties.AutomationId="ItemGridView"
            AutomationProperties.Name="Grouped Items"
            Grid.RowSpan="3"
            Padding="116,137,40,46"
            ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"
            ItemTemplate="{StaticResource FileEntriesTemplate}"
            ItemClick="ItemView_ItemClick"
            IsItemClickEnabled="True"
            SelectionMode="None"
            IsSwipeEnabled="false">

テンプレートは

<DataTemplate x:Key="FileEntriesTemplate">
<Grid HorizontalAlignment="Left" Width="400" Height="80" Background="Beige">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="80"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Image Source="{Binding Image}" Stretch="Uniform" Grid.Column="0" Margin="10,0,0,0" AutomationProperties.Name="{Binding Title}"/>

    <StackPanel Orientation="Vertical" Grid.Column="1" Background="Transparent">
        <TextBlock Text="{Binding Title}" Foreground="Black" Style="{StaticResource LargeTitleTextStyle}" Margin="20,20,10,0"/>
        <TextBlock Text="{Binding Subtitle}" Foreground="gray" Style="{StaticResource CaptionTextStyle}" TextWrapping="NoWrap" Margin="20,10,0,30"/>
    </StackPanel>
</Grid>

4

1 に答える 1

4

GridView は、DataTemplateSelector から継承して作成できるクラスである ItemTemplateSelector プロパティを通じてこれを公開します。例として、Issue と Repositories がバインドされた GridView があり、それぞれに異なるデータ テンプレートを使用したいとします。

私のデータ テンプレート セレクターは次のようになります。

public class IssueSummaryTemplateSelector : DataTemplateSelector
{
    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        return item is IssueGroupViewModel ? IssueTemplate : RepositoryTemplate;
    }

    public DataTemplate RepositoryTemplate
    {
        get;
        set;
    }

    public DataTemplate IssueTemplate
    {
        get;
        set;
    }
}

次に、xaml でセレクターを Resource として宣言し、Repository と Issues に使用する 2 つのテンプレートを割り当てます。

<selectors:IssueSummaryTemplateSelector x:Key="IssueSummarySelector"
                                        IssueTemplate="{StaticResource IssueGridZoomedOutTemplate}"
                                        RepositoryTemplate="{StaticResource IssueGridRepositoryZoomedOutTemplate}"/>

その後、GridView で使用できます。

<GridView ItemTemplateSelector="{StaticResource IssueSummarySelector}" />
于 2013-07-15T20:55:29.247 に答える