Я - не совсем понимание различие между ItemsSource и DataContext. Кто-то может объяснить это и создать резервную копию его с примерами? Когда был бы я использовать один или другой.
Я читаю документы, и это говорит, что я могу связать использование DataContext, но я бросаю ObservableCollection в него, и ничто не обнаруживается в списке. Если я бросаю тот же набор в ItemsSource, он хорошо работает.
Элементы управления (включая ListBox) ничего не делают со значением из DataContext
вообще. Его цель - предоставить контекст для привязок данных .
Предположим, у вас есть ListBox
«myList» и MyData
«myData». Тип MyData
имеет свойство «Люди» типа ObservableCollection
, а тип Человек
, в свою очередь, имеет строковые свойства «Имя» и «Фамилия» .
Все перечисленные ниже варианты эквивалентны: -
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>
Вы заметите здесь пару вещей. DataContext
myList вообще не назначается. В этом случае дерево предков элемента управления просматривается до тех пор, пока не будет найден предок, у которого действительно есть значение, присвоенное свойству DataContext
.
Кроме того, каждый ListBoxItem
, динамически генерируемый для каждого экземпляра Person
, имеет этот экземпляр Person
, назначенный в качестве своего DataContext
, то есть как Forename и Привязки к фамилии успевают заработать.