2010-07-02 28 views
22

Tôi không hoàn toàn lúng túng sự khác biệt giữa ItemsSource và DataContext. Ai đó có thể giải thích nó và sao lưu nó với các ví dụ? Khi nào tôi sử dụng cái này hay cái kia.Sự khác biệt giữa các mụcSource và DataContext liên quan đến ListBox

Tôi đang đọc tài liệu và nó nói rằng tôi có thể ràng buộc bằng cách sử dụng DataContext, nhưng tôi ném một ObservableCollection vào nó và không có gì xuất hiện trong danh sách. Nếu tôi ném cùng một bộ sưu tập tại ItemsSource, nó hoạt động tốt.

Trả lời

43

Điều khiển (bao gồm ListBox) không làm bất cứ điều gì với giá trị là DataContext. Mục đích của nó là cung cấp ngữ cảnh cho các dữ liệu các ràng buộc.

Giả sử bạn có ListBox "myList" và MyData "myData". Loại MyData có thuộc tính "Mọi người" thuộc loại ObservableCollection<Person> và lần lượt loại Person có thuộc tính chuỗi "Tên" và "Họ".

Tất cả những điều sau đây được tương đương: -

myList.ItemsSource = myData.People; 

hoặc

myList.DataContext = myData; 
myList.SetBinding(ItemsControl.ItemsSourceProperty, new Binding("People")); 

hoặc

myList.DataContext = myData.People; 
myList.SetBinding(ItemsControl.ItemsSourceProperty, new Binding()); 

Thông thường mặc dù cam kết ràng buộc được cấu hình trong XAML và DataContext của LayoutRoot được gán đối tượng dữ liệu: -

LayoutRoot.DataContext = myData; 

bạn có thể có XAML sau: -

<Grid x:Name="LayoutRoot"> 
    <ListBox x:Name="myList" ItemsSource="{Binding People}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding Forename}" Margin="2" /> 
      <TextBlock Text="{Binding Surname}" Margin="2" /> 
     </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

Bạn sẽ lưu ý một vài điều ở đây. DataContext của "myList" không được gán gì cả. Trong trường hợp này cây tổ tiên của cây điều khiển được chuyển đến khi một tổ tiên được tìm thấy có giá trị được gán cho thuộc tính DataContext.

Ngoài ra, mỗi ListBoxItem được tạo động cho mỗi cá thể Person có trường hợp Person được gán làm DataContext đó là cách gắn kết Tên họ và Tên họ hoạt động.

+5

Cảm ơn bạn rất nhiều. Đây là lời giải thích dễ hiểu đầu tiên tôi đã tìm thấy. – AngryHacker

+0

@AnthonyWJones Damn câu trả lời hay –