2009-02-03 31 views
10

Tôi có một hộp danh sách và tôi muốn lặp lại một tập hợp các Bars trong đối tượng Foo của tôi.Làm thế nào để đúng cách ràng buộc một ListBoxItem trong WPF?

<ListBox DataContext="{Binding Path=Foo.Bars}" > 
    <ListBox.Items> 
     <ListBoxItem> 
      <ContentControl DataContext="{Binding Path=.}" /> 
     </ListBoxItem> 
    </ListBox.Items> 
</ListBox> 

Đây là bảng dữ liệu tôi muốn sử dụng.

<DataTemplate DataType="{x:Type Bar}"> 
     <Label Content="hello stackoverflow" /> 
</DataTemplate> 

Nếu tôi ăn trộm (-> kiểm tra bằng cách sử dụng công cụ Snoop) ứng dụng của tôi, tôi nhận thấy rằng toàn bộ bộ sưu tập lượng quán bar được ràng buộc với ContentControl, thay vì chỉ 1.

Làm cách nào để tôi có thể liên kết chính xác để việc lặp lại trong bộ sưu tập diễn ra tốt đẹp?

Trả lời

3

Đầu tiên thêm namespace của bạn vào Window yếu tố (Intellisense):

xmlns:local="clr-namespace:yourenamespace" 

Rồi sau XAML (trong Window.Resources là một cách sạch để làm điều đó):

<Window.Resources> 

     <ObjectDataProvider x:Key="DataProvider" ObjectType="{x:Type local:Foo}"/> 

     <DataTemplate x:Key="Template" > 
      <TextBlock Text="{Binding Bar}"/> 
     </DataTemplate> 

    </Window.Resources> 

Đặt Listbox:

<ListBox DataContext="{Binding Source={StaticResource DataProvider}}" ItemsSource="{Binding Bars}" ItemTemplate="DynamicResource Template" /> 

Nhưng, nó d epends trên đối tượng code-behind của bạn, bạn phải thiết lập một hàm khởi tạo để khởi tạo các thuộc tính công khai trong đối tượng của bạn là ObservableCollection<> tốt hơn (Có một số quy tắc hạn chế với cá thể đối tượng trong XAML).

+0

Tôi đã triển khai tính năng này và nó không hoạt động. – Natrium

+1

Tôi khuyên bạn nên nhập mã đối tượng trong câu hỏi của mình. Có một số lỗi cú pháp trong câu trả lời của tôi, tôi sửa nó (Tài nguyên, không Resouce, GridView lãng quên, tôi đang gõ tất cả bằng tay ...). – belaz

+0

thực sự tôi đang sử dụng ListBox. Lần đầu tiên tôi đăng ListView, nhưng tôi đã chỉnh sửa nó. – Natrium

8

Bạn chỉ có thể đặt DataTemplate và WPF thực hiện tất cả công việc. Đặt ItemsSource vào danh sách các mục Bar và sau đó xác định DataTemplate cho các mục Bar.

<ListBox ItemsSource="{Binding Path=Foo.Bars}"> 
    <ListBox.Resources> 
     <DataTemplate DataType="{x:Type Bar}"> 
      <Label Content="hello stackoverflow" /> 
     </DataTemplate> 
    </ListBox.Resources> 
</ListBox> 

Bạn cũng có thể thiết lập các ItemsTemplate trực tiếp bằng cách sử dụng <ListBox.ItemTemplate> thay vì <ListBox.Resources>

Xem Data Binding Overview tại MSDN.

+0

liên kết được cung cấp dường như đã chết .. – Default

+0

@Default Vâng, liên kết đó bị xóa đi và tôi không thể tìm thấy sự thay thế xin lỗi. Nó chỉ là một bài viết nói về các ràng buộc trong WPF. –

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