2009-03-31 35 views
47

Tôi đã tự hỏi làm thế nào mọi người xử lý một ListBox kiểm soát mà không có mục? ví dụ. Tôi muốn liên kết danh sách kết quả tìm kiếm nhưng nếu không tìm thấy kết quả nào tôi muốn hiển thị "Không tìm thấy kết quả".Danh sách WPF trống datatemplate

Cách tôi hiện đang giải quyết vấn đề này là tôi ẩn hộp danh sách nếu tập hợp kết quả đếm = 0 và hiển thị nhãn có thông báo "Không tìm thấy kết quả". Lý tưởng nhất là tôi muốn một cái gì đó giống như giải pháp ASP .NET datagrid EmptyTemplate.

Cheers

Trả lời

95

Tôi đã có một số thành công với mã này:

<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 có vẻ tốt với tôi, tôi có thể phải sử dụng một ngày đó. – bendewey

+0

Điều này hoạt động rất độc đáo. –

+0

Tôi đã thấy các biến thể với bộ chọn mẫu dữ liệu, nhưng điều này là không có code-behind, rực rỡ! – levanovd

7

Dựa trên câu trả lời chấp nhận @ Matt Hamilton, để tham khảo, tôi đã tạo ra một sự thay đổi mà không đòi hỏi sự ràng buộc, vì nó sử dụng HasItems tài sản của ListBox để kích hoạt các mẫu trống:

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

Điều này cho phép các phong cách được sử dụng trên toàn cầu, mà không cần phải biết tên thuộc tính mà danh sách liên kết. Tôi thấy nó hữu ích khi liên kết với một số CollectionViewSource được định nghĩa trong XAML.

Tôi không biết bất kỳ hạn chế nào của phương pháp này, các nhận xét sẽ được chào đón nếu bạn nên tìm bất kỳ.

+0

Nó hoạt động, nhưng nó đặt ra một vấn đề đối với tôi. Listbox của tôi chấp nhận thả vào nó (kéo-và-thả), tuy nhiên khi tôi đặt 'Template' nó không thể chấp nhận các giọt nữa, chỉ khi tôi di chuột qua nội dung thực tế, đó là' TextBlock'. Làm sao tôi có thể giải quyết việc này? – JobaDiniz

+0

Có thể hành vi kéo thả xuất phát từ 'ListBoxItem' thay vì chính' ListBox'. Có lẽ việc thêm 'TextBlock' vào một' ListBoxItem' trong mẫu điều khiển có thể làm tròn vấn đề này? Tôi khuyên bạn nên xem qua [nguồn tham khảo WPF] (http://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/ListBox.cs) và làm việc với [Snoop] (https : //snoopwpf.codeplex.com/). –

+0

Tôi đang sử dụng [Thanh tra WPF] (https://wpfinspector.codeplex.com/) và tôi đã cố gắng thêm TextBlock vào trong ListBoxItem, tuy nhiên vấn đề vẫn còn ... khi tôi Ngang & dọc căn chỉnh nội dung thành * * center ** (do đó, văn bản được hiển thị ở trung tâm của ListBox) – JobaDiniz

Các vấn đề liên quan