2009-11-30 3 views
0

J'ai une vue de liste qui affiche des données en utilisant le gridview. Cette liste affiche les données typiques des vues de la grille. Beaucoup de données affichées dans les lignes et les colonnes. Cependant, sur certaines lignes, je n'ai aucune donnée à afficher dans les colonnes. Je voudrais échanger le modèle d'élément pour cette ligne et afficher un autre modèle pour la ligne entière qui afficherait quelque chose comme "ligne vide" ou "ligne vide" pour le texte et styliser également la rangée entière pas les cellules individuelles. J'ai essayé d'utiliser ce poste: http://cloudstore.blogspot.com/2008/06/creating-custom-view-mode-that-supports.html. J'ai donc une vue personnalisée pour la vue de la liste. Fondamentalement, j'ai sous-classé la classe GridView et sur le remplacement de la méthode PrepareItems, je peux sélectionner le nouveau modèle que je veux afficher pour une ligne particulière ou le modèle par défaut. Cependant, lorsque j'essaie de sélectionner un nouveau modèle, le gridview ne rendra jamais rien pour cette ligne. Il sera toujours rendu si j'utilise le modèle par défaut. Je suppose que la disposition pour un GridView interfère avec mon réglage du modèle pour la ligne que je veux échanger. Est-ce possible ou dois-je créer une vue personnalisée qui imite le GridView et ne sous-classe pas la classe GridView? Je voudrais garder les colonnes comme elles sont sans trop de retravailler. Des suggestions ou quelqu'un ont de l'expérience avec ce type de scénario?wpf listview gridview modèle d'élément d'échange

Répondre

1

Ok, voici ce que j'ai fait pour résoudre mon problème, mais il va falloir faire quelques retouches de ma part. J'ai remplacé avec ma listview avec un contrôle d'éléments. Donc, je n'utilise plus le GridView de la liste. Au lieu de cela j'ai défini un GridViewColumnCollection avec mes colonnes configurées avec comment je les voulais.

Pour mon en-tête, j'ai utilisé un GridViewHeaderRowPresenter avec sa propriété columns liée à GridViewColumnCollection. Cela prend soin des en-têtes de colonne.

Sous mon en-tête, j'insère le ItemsControl qui est lié à ma liste d'éléments. Toutefois, j'utilise maintenant un DataTemplateSelector qui permutera le modèle en fonction de l'élément et de ses propriétés. Si vous n'êtes pas familier avec le DataTemplate Selector aller ici: data template selector

Fondamentalement, mon modèle par défaut des éléments de la liste est une GridViewRowPresenter qui ses colonnes de propriété est liée à GridViewColumnCollection. Cela le garde en ligne avec les en-têtes. Cependant, je peux toujours remplacer le modèle d'une ligne par un autre dans le sélecteur de modèles de données. Et cela résout mon problème.

Cependant, je dois maintenant retravailler une listview avec une grille que j'ai stylisée, et utiliser cette méthode. Donc, cela ne vient pas sans coût.

1

Vous pouvez utiliser DataTriggers. Utilisez le code comme celui-ci (en fonction de modèles de commutation si la valeur de SomeItemProperty est 0 ou non):

<DataTemplate x:Key="MyItemTemplate"> 
    <StackPanel> 
     <StackPanel Name="normalStackPanel"> 
      <!-- template for normal row --> 
     </StackPanel> 
     <StackPanel Name="emptyStackPanel" Visibility="Collapsed"> 
      <!-- template for empty row --> 
     </StackPanel> 
    </StackPanel> 

    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding SomeItemProperty}" Value="0"> 
      <Setter TargetName="normalStackPanel" Property="Visibility" Value="Collapsed" /> 
      <Setter TargetName="emptyStackPanel" Property="Visibility" Value="Visible" /> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

Hope it helps.