2010-10-07 12 views
1

J'ai un ListView WPF, qui a une grille en tant que ItemsPanelTemplate. Je montre mes articles dans la colonne et la rangée correctes basées sur une propriété de l'article. Mais je voudrais mettre quelques contrôles dans les cellules vides de ma grille.Ajouter des contrôles pour vider des cellules dans une grille qui est le ItemsPanelTemplate pour un ListView

Ceci est une version simplifiée de mon code et XAML:

des ressources:

<ItemsPanelTemplate x:Key="TheTemplate"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="1*" /> 
      <ColumnDefinition Width="1*" /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="1*"/> 
      <RowDefinition Height="1*"/> 
     </Grid.RowDefinitions> 
    </Grid> 
</ItemsPanelTemplate> 

Dans le XAML:

<Controls:CustomListView ItemsSource="{Binding TheCollection}" 
          ItemsPanel="{DynamicResource TheTemplate}"> 
</Controls:CustomListView> 

Enfin, dans mon CustomListView:

protected override void PrepareContainerForItemOverride(DependencyObject element, object item) 
{ 
    base.PrepareContainerForItemOverride(element, item); 
    var viewModel = item as DomainObject; 
    if (viewModel != null) 
    { 
     element.SetValue(Grid.ColumnProperty, 1); //here I work with a converter, but this just simplifies it for StackOverflow 
     element.SetValue(Grid.RowProperty, 1); 
    } 
} 

NOTE: Je sais que je suis en train de lancer un DomainObject, mais s'il vous plait, faites attention.

Ce que cela va me donner, est une grille avec des éléments dans la ligne et la colonne correctes. Mais que faire si je veux afficher quelque chose dans les cellules vides, par exemple un texte comme 'null'?

Je ne peux pas simplement l'ajouter à mon modèle, car cela bloque l'application, en disant que ItemsControl créera les contrôles nécessaires. J'ai essayé d'accéder à la grille/au modèle en code-behind, mais je n'arrive pas à trouver comment. Peut-être que je ne devrais pas utiliser le ListView? Peut-être qu'il existe d'autres/meilleures solutions?

Répondre

0

Ce que je fini par faire était:

  • Faire une grille avec tous mes ColumnDefinitions et RowDefinitions (je sais combien j'ai besoin)
  • Dans le code-behind de mon avis, je jetai mon DataContext à ce que je sais que ce sera
  • J'itérer sur la collection, et pour chaque élément, je crée un nouveau contrôle et définissez son DataContext à l'élément
  • je puis définissez les RowProperty et COLUMNPROPERTY et ajouter ce contrôle à la grille
  • Je me souviens aussi où j'ai ajouté tous ces contrôles, donc je peux ajouter des contrôles vides à la grille où il n'y en a pas encore.

C'est ce que je pense que je vais changer pour des raisons de performance: - Au lieu d'itération sur la collection d'éléments, itérer sur toutes les cellules possibles de la grille, ajoutez un contrôle (toujours), et régler le DataContext s'il y a un article correspondant.

La raison pour cela est la performance. Il faut environ 2 secondes pour remplir la grille, et j'aimerais que ce soit plus rapide.