2009-03-18 6 views
1

Je suis nouveau sur WPF et je ne sais pas comment implémenter ce dont j'ai besoin.wpf listview/gridview: masquer le contenu répété

Mon problème:

J'ai une donnée liée WPF gridview afficher les résultats d'une requête SQL. Certaines colonnes présentent des données répétées que j'aimerais masquer. Ce:

occupancy name  room 
--------- --------- ----- 
Occupied Bob  1 
Occupied Ted  2 
Available    3 
Available    4 

devrait ressembler à ceci:

occupancy name  room 
--------- --------- ----- 
Occupied Bob  1 
      Ted  2 
Available    3 
         4 

Mon environnement:

en utilisant C# sur .NET 3.5. J'ai lié le listview à une collection dataview. J'ai un modèle de données pour les cellules pour contrôler le formatage.

Ma solution tenative:

Je pensais que je devrais appliquer un déclencheur au modèle et modifier les propriétés pour rendre le texte vide sur toutes les lignes après la première où les données sont les mêmes que la ligne précédente.

Lorsque je configure le déclencheur, puis-je effectuer tout cela dans xaml ou dois-je écrire du code pour accéder à la ligne précédente?

Si c'est en XAML, comment construisez-vous la (les) chaîne (s) de liaison pour référencer les colonnes dans les lignes actuelles et précédentes de la vue de données à laquelle elle est liée? Va-t-il s'étouffer au premier rang puisqu'il n'y a pas de rangée précédente?

est ici le modèle que je travaille avec:

<DataTemplate x:Key="Occupancy"> 
    <TextBlock Name="Occupancy" Text="{Binding Path=Occupancy}" TextAlignment="Left" /> 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding Path=Occupancy}"> 
      <DataTrigger.Value>Available</DataTrigger.Value> 
      <Setter TargetName="Occupancy" Property="**{previous column's content}**" Value="**{current columns content}**"/> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

Peut-être utiliser RelativeSource: ?? PreviousData

Si je dois écrire du code, quelqu'un est-il au courant d'un tutoriel décent qui me permettrait de démarrer?

D'autres solutions sont acceptables, même si je pense qu'un style sans code que je pourrais appliquer à de nombreuses colonnes serait la solution optimale.

Merci pour votre temps.

Jay

Répondre

1

L'option de données précédente fonctionne uniquement avec ListView et uniquement si GridView n'est pas associé à cette propriété. Je crois que cela peut être parce qu'avec une vue accrochée au contrôle ListView il ne crée pas une collection ItemsControl. Le code qui trouve les données précédentes vérifie un élément précédent dans la collection ItemsControl. Ce n'est qu'une idée cependant.

2

J'ai eu une expérience négative avec le RelativeSource: PreviousData. Cela a fonctionné dans ListBox, mais dans la vue de liste j'obtenais une erreur "Impossible de trouver l'élément précédent pour l'utiliser comme RelativeSource parce qu'il n'y a aucun parent dans le contexte généré."

J'ai finalement abandonné et énuméré des lignes moi-même (l'idée était de l'utiliser pour imprimer les numéros de ligne).

Dans votre situation, j'utiliserais un ModelView dont les éléments de liste pointeraient vers les éléments correspondants et précédents de votre Modèle. Donc si precedent et actuel ont la meme valeur dans la propriete correspondante, l'element de ModelView renverra null.

+0

J'ai essayé d'amener les gars de Sqlite à ajouter une fonction intégrée pour renvoyer le numéro de ligne du jeu de résultats de requête mais ils n'en ont pas vu la valeur;) Merci – Jay

1

Je n'ai pas beaucoup d'expérience avec le WPView ListView (j'ai tendance à m'en tenir aux contrôles/conteneurs plus basiques), mais avez-vous envisagé de regrouper d'abord les données d'origine avec une requête LINQ?

+0

Il est déjà groupé par la requête sql. Un collègue a souligné qu'il serait beaucoup plus simple d'enlever le contenu répété et de le mettre dans une rubrique. Je peux finir par faire ça. Aller avec le flux pour le faire dans un délai raisonnable. Merci pour la suggestion cependant. – Jay

Questions connexes