2009-03-31 11 views
47

Je me demandais comment les gens gèrent un contrôle ListBox qui n'a aucun élément? par exemple. Je veux lier une liste de résultats de recherche mais si aucun résultat n'est trouvé, je voudrais afficher "Aucun résultat trouvé".WPF listbox empty datatemplate

La façon dont je m'attaque actuellement à ceci est que je cache la liste si le jeu de résultats compte = 0 et affiche une étiquette avec le message "Aucun résultat trouvé". Idéalement, je voudrais quelque chose comme la solution ASP .NET DataGrid EmptyTemplate.

Vive

Répondre

95

J'ai eu un certain succès avec ce code:

<Style TargetType="ListBox" x:Key="ListStyle" BasedOn="{StaticResource {x:Type ListBox}}"> 
    <Style.Triggers> 
     <DataTrigger 
      Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Items.Count}" 
      Value="0" 
      > 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <TextBlock>No items to display</TextBlock> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
+0

+1 me semble bon, je devrais utiliser un jour. – bendewey

+0

Cela fonctionne très bien. –

+0

J'ai vu des variantes avec des sélecteurs de gabarit de données, mais celui-ci est sans code-behind, génial! – levanovd

7

Sur la base de la réponse acceptée de @ Matt Hamilton, pour référence, je crée une variation qui ne nécessite pas la liaison, comme utilise la propriété HasItems du ListBox pour déclencher le modèle vide:

<ListBox.Style> 
    <Style x:Key="EmptyListStyle" 
      TargetType="ListBox" 
      BasedOn="{StaticResource {x:Type ListBox}}"> 
     <Style.Triggers> 
      <!-- Use ListBox.HasItems instead of Binding --> 
      <Trigger Property="HasItems" Value="False"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate> 
          <TextBlock>No items to display</TextBlock> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</ListBox.Style> 

Cela permet le style à utiliser globalement, sans avoir à connaître le nom de la propriété à laquelle la liste se lie. Je l'ai trouvé utile lors de la liaison à un CollectionViewSource défini dans XAML.

Je ne suis pas au courant des inconvénients de cette méthode, les commentaires sont les bienvenus si vous en trouvez.

+0

Cela fonctionne, mais cela pose un problème pour moi. Ma listbox accepte de tomber dedans (drag-and-drop), cependant quand je mets ce 'Template' il ne peut plus accepter les gouttes, seulement quand je souris sur le contenu réel, c'est-à-dire' TextBlock'. Comment puis-je resoudre ceci? – JobaDiniz

+0

Il est possible que le comportement de glisser-déposer provienne du 'ListBoxItem's plutôt que du' ListBox' lui-même. Peut-être ajouter le 'TextBlock' à un' ListBoxItem' dans le modèle de contrôle pourrait contourner ce problème? Je vous recommande de jeter un coup d'œil aux [sources de référence WPF] (http://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/ListBox.cs) et de travailler avec [Snoop] (https : //snoopwpf.codeplex.com/) aussi. –

+0

J'utilise [WPF Inspector] (https://wpfinspector.codeplex.com/) et j'ai essayé d'ajouter le TextBlock dans un ListBoxItem, mais le problème persiste ... quand Horizontal & Vertical alignent le contenu sur * * center ** (donc le texte est affiché au centre de ListBox) – JobaDiniz