2009-03-31 18 views
47

Me preguntaba cómo las personas manejan un control ListBox que no tiene elementos? p.ej. Quiero vincular una lista de resultados de búsqueda, pero si no se encuentran resultados, me gustaría mostrar "No se encontraron resultados".WPF listbox empty datatemplate

La forma en que abordo esto actualmente es que oculto el listbox si el resultado establece count = 0 y muestro una etiqueta con el mensaje "No se encontraron resultados". Idealmente, me gustaría algo como la solución ASP.NET datagrid EmptyTemplate.

Saludos

Respuesta

95

he tenido algo de éxito con este código:

<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 se ve bien para mí, podría tener que usar ese día. – bendewey

+0

Esto funciona muy bien. –

+0

Vi variantes con selectores de plantillas de datos, pero este es sin código subyacente, ¡brillante! – levanovd

7

Basado en respuesta aceptada de @ Matt Hamilton, para referencia, he creado una variación que no requiere la unión, ya que utiliza la propiedad de la HasItemsListBox para desencadenar la plantilla vacía:

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

Esto permite que el estilo que se utiliza a nivel mundial, sin tener que saber el nombre de la propiedad a la que se une la lista. Lo encontré útil cuando se vincula a un CollectionViewSource definido en XAML.

No tengo conocimiento de ningún inconveniente de este método, los comentarios son bienvenidos si encuentra alguno.

+0

Funciona, pero plantea un problema para mí. Mi listbox acepta caer en él (arrastrar y soltar), sin embargo, cuando configuro esa 'Plantilla 'ya no puedo aceptar gotas, solo cuando muevo el mouse sobre el contenido real, es decir, el' TextBlock'. ¿Como puedo resolver esto? – JobaDiniz

+0

Es posible que el comportamiento de arrastrar y soltar provenga de 'ListBoxItem's en lugar de' ListBox'. Quizás agregar el 'TextBlock' a un' ListBoxItem' en la plantilla de control podría solucionar este problema. Recomiendo echar un vistazo a las [fuentes de referencia de WPF] (http://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/ListBox.cs) y trabajar con [Snoop] (https : //snoopwpf.codeplex.com/) también. –

+0

Estoy usando [WPF Inspector] (https://wpfinspector.codeplex.com/) y he intentado agregar TextBlock dentro de ListBoxItem; sin embargo, el problema persiste ... cuando Horizontal y Vertical alineo el contenido a * * center ** (para que el texto se muestre en el centro de ListBox) – JobaDiniz

Cuestiones relacionadas