2010-06-15 6 views
1

Je crée actuellement une application WPF, en utilisant C# et XAML dans Visual Studios 2010.Plusieurs grilles dans une zone

J'ai une grille principale. Dans cette grille principale, j'ai une barre de groupe dans laquelle vous pouvez sélectionner différents éléments. En fonction de ce que vous sélectionnez, le milieu de la grille principale peut être totalement différent. Ce que je me demandais, c'est quelle est la meilleure façon de programmer la partie médiane?

À l'heure actuelle, je l'ai configuré de telle manière que tout ce qui est au milieu est programmé dynamiquement en C#, et tout ce qui est à l'extérieur est programmé en XAML. Programmé en C# I: pour chaque élément de la barre de groupe, il y a une grille qui l'accompagne (de sorte qu'un contenu différent peut y être affiché). Chaque grille est un enfant de la grille principale. Chaque grille est visible ou cachée si nécessaire. Est-ce la meilleure façon d'aborder cela? Le meilleur exemple de ceci est dans Outlook 2007, où vous avez votre barre de groupe sur le côté droit. Lorsque vous sélectionnez différents éléments dans la barre de groupe (courrier, calendrier, tâches), le droit de la barre de groupe change complètement.

Répondre

1

La méthode la plus simple pour cela dans WPF consiste à définir des DataTemplates pour chacune de vos sections "intermédiaires". Dans l'exemple Outlook, vous pouvez avoir une classe MessageCollection qui stocke une liste de messages, une classe EventCollection qui stocke une liste d'événements de calendrier et une classe TaskCollection qui stocke une liste de tâches.

Dans votre zone "intermédiaire", vous disposez simplement d'un ContentPresenter unique dont le contenu est défini sur un objet MessageCollection, EventCollection ou TaskCollection. Vraisemblablement, cela serait fait en utilisant une liaison à une propriété de modèle de vue.

Voici comment cela pourrait ressembler:

<Window ...> 
    <Grid> 
    <!-- group bar area --> 
    ... 

    <!-- "middle" area --> 
    <ContentPresenter Grid.Row="1" Grid.Column="1" 
         Content="{Binding SelectedCollection}" /> 
    </Grid> 
</Window> 

Maintenant, vous créer un DataTemplate pour chacun des types de collecte, par exemple:

<DataTemplate TargetType="{x:Type my:MessageCollection}"> 
    <Grid> 
    ... put the XAML for displaying mailbox contents here ... 
    </Grid> 
</DataTemplate> 

<DataTemplate TargetType="{x:Type my:EventsCollection}"> 
    <Grid> 
    ... put the XAML for displaying a calendar here ... 
    </Grid> 
</DataTemplate> 

<DataTemplate TargetType="{x:Type my:TasksCollection}"> 
    <Grid> 
    ... put the XAML for displaying a to-do list here ... 
    </Grid> 
</DataTemplate> 

Avec cette configuration, tout ce que vous devez faire pour changer la grille interne est de définir votre propriété "SelectedCollection" dans votre modèle de vue à un type de collection différent.

+0

est-ce que SelectedCollection serait une ICollection? – Berryl

+0

Il pourrait être, mais je le déclarerais probablement comme objet, et peut-être même le renommer en "CurrentView" ou quelque chose comme ça. Théoriquement, vous pourriez finir par créer des vues sélectionnables par la barre de groupe et pour lesquelles "collection" serait un abus de langage. Le point principal est que vous avez une propriété dans votre modèle de vue qui contient un objet modèle à afficher dans la zone "milieu". Le travail du ContentPresenter consiste à sélectionner automatiquement le DataTemplate approprié pour l'afficher. Dans l'exemple Outlook, chaque vue du "milieu" est une collection, c'est pourquoi je l'ai appelée "SelectedCollection". –

Questions connexes