2009-03-31 21 views
47

Mi chiedevo in che modo le persone gestiscono un controllo ListBox senza elementi? per esempio. Voglio associare un elenco di risultati di ricerca ma se non vengono trovati risultati vorrei visualizzare "Nessun risultato trovato".datatemplate casella di riepilogo WPF

Il modo in cui attualmente mi occupo di questo è che nascondo la casella di riepilogo se il set di risultati conta = 0 e mostra un'etichetta con il messaggio "Nessun risultato trovato". Idealmente mi piacerebbe qualcosa come la soluzione EmptyTemplate datagrid di ASP .NET.

Acclamazioni

risposta

95

ho avuto un certo successo con questo codice:

<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 mi sembra buono, potrei doverlo usare un giorno. – bendewey

+0

Funziona molto bene. –

+0

Ho visto varianti con selettori di modelli di dati, ma questo è senza code-behind, geniale! – levanovd

7

Sulla base di risposta accettato di @ Matt Hamilton, per riferimento, ho creato una variante che non richiede l'associazione, in quanto utilizza la proprietà HasItems del ListBox per attivare il modello vuoto:

<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> 

in questo modo lo stile da utilizzare a livello globale, senza dover conoscere il nome della proprietà a cui lega la lista. L'ho trovato utile quando si associa a un CollectionViewSource definito in XAML.

Non sono a conoscenza di alcun inconveniente di questo metodo, i commenti sono benvenuti se dovessi trovarne uno.

+0

Funziona, ma solleva un problema per me. Il mio listbox accetta di trascinarlo dentro (trascina e rilascia), tuttavia quando imposto quel 'Template' non può più accettare drops, solo quando passo il mouse sul contenuto attuale, cioè, 'TextBlock'. Come posso risolvere questo? – JobaDiniz

+0

È possibile che il comportamento del trascinamento provenga dal 'ListBoxItem's piuttosto che dal' ListBox' stesso. Forse aggiungere il 'TextBlock' a un' ListBoxItem' nel modello di controllo potrebbe aggirare questo problema? Consiglio di dare un'occhiata alle [fonti di riferimento WPF] (http://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/ListBox.cs) e lavorare con [Snoop] (https : //snoopwpf.codeplex.com/). –

+0

Sto usando [WPF Inspector] (https://wpfinspector.codeplex.com/) e ho provato ad aggiungere il TextBlock all'interno di un ListBoxItem, tuttavia il problema rimane ... quando I orizzontale e verticale allinea il contenuto a * * center ** (quindi il testo viene visualizzato al centro di ListBox) – JobaDiniz

Problemi correlati