2009-03-31 4 views
47

Мне было интересно, как люди обрабатывают элемент управления ListBox, который не имеет элементов? например Я хочу связать список результатов поиска, но если результатов не найдено, я бы хотел отобразить «Результаты не найдены».WPF listbox empty datatemplate

Способ, которым я сейчас занимаюсь, заключается в том, что я скрываю список, если результат набора count = 0 и показывает метку с сообщением «Нет результатов». В идеале мне бы хотелось что-то вроде решения ASPT для .NET.

Приветствия

ответ

95

Я имел некоторый успех с этим кодом:

<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 выглядит хорошо для меня, возможно, мне придется использовать этот день. – bendewey

+0

Это работает очень хорошо. –

+0

Я видел варианты с селекторами шаблонов данных, но этот без кода, блестящий! – levanovd

7

на основе принятого ответа @ Matt Гамильтона, для справки, я создал вариант, который не требует привязки, как это использует HasItems свойства ListBox, чтобы вызвать пустой шаблон:

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

Это позволяет стиль для использования во всем мире, без необходимости знать имя свойства, к которому привязан список. Я нашел его полезным при привязке к CollectionViewSource, определенному в XAML.

Я не знаю никаких недостатков этого метода, комментарии приветствуются, если вы найдете их.

+0

Это работает, но это вызывает у меня проблему. Мой список позволяет принять его (drag-and-drop), однако, когда я устанавливаю этот «шаблон», он больше не может принимать капли, только когда я нажимаю на фактический контент, то есть на «TextBlock». Как я могу это решить? – JobaDiniz

+0

Возможно, что поведение перетаскивания происходит из 'ListBoxItem', а не из' ListBox'. Возможно, добавление «TextBlock» в «ListBoxItem» в шаблоне управления может обойти эту проблему? Я бы рекомендовал взглянуть на [справочные источники WPF] (http://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/ListBox.cs) и работать с [Snoop] (https : //snoopwpf.codeplex.com/) тоже. –

+0

Я использую [WPF Inspector] (https://wpfinspector.codeplex.com/), и я попытался добавить TextBlock внутри ListBoxItem, однако проблема остается ... когда I Horizontal & Vertical выравнивает содержимое до * * center ** (поэтому текст отображается в центре списка ListBox) – JobaDiniz

Смежные вопросы