Đ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.
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
@AnthonyWJones Damn câu trả lời hay –