Разница между ItemsSource и DataContext как относится к ListBox
Я не совсем понимаю разницу между ItemsSource и DataContext. Может ли кто-нибудь объяснить это и подкрепить примерами? Когда я буду использовать то или другое.
Я читаю документы, и он говорит, что я могу связать с помощью DataContext, но я бросаю ObservableCollection на него, и ничего не появляется в списке. Если я бросаю ту же коллекцию в ItemsSource, она работает нормально.
1 ответов
элементы управления (включая список) ничего не делают со значением DataContext
на всех. Его цель - предоставить контекст для data привязки.
предположим, у вас есть ListBox
"myList" и A MyData
"myData". The MyData
тип имеет свойство "люди" типа ObservableCollection<Person>
и в свою очередь Person
type имеет строковые свойства "Forename"и " фамилия".
все следующие эквивалент:-
myList.ItemsSource = myData.People;
или
myList.DataContext = myData;
myList.SetBinding(ItemsControl.ItemsSourceProperty, new Binding("People"));
или
myList.DataContext = myData.People;
myList.SetBinding(ItemsControl.ItemsSourceProperty, new Binding());
обычно, хотя привязки настроены в Xaml, и DataContext LayoutRoot назначается объекту данных: -
LayoutRoot.DataContext = myData;
у вас может быть следующий Xaml: -
<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>
здесь вы заметите пару вещей. The DataContext
"myList" не назначается вообще. В этом случае дерево предков элемента управления перемещается до тех пор, пока не будет найден предок, который имеет значение, присвоенное DataContext
собственность.
тоже друг ListBoxItem
динамически генерируется для каждого Person
инстанции, что Person
экземпляр, назначенный как его DataContext
именно так работают привязки имени и фамилии.