私は、ItemsSource と DataContext の違いをよく理解していません。誰かがそれを説明し、例を挙げてバックアップできますか? どちらか一方をいつ使用しますか。
ドキュメントを読んでいると、DataContext を使用してバインドできると書かれていますが、ObservableCollection をスローしてもリストに何も表示されません。ItemsSource で同じコレクションをスローすると、正常に動作します。
私は、ItemsSource と DataContext の違いをよく理解していません。誰かがそれを説明し、例を挙げてバックアップできますか? どちらか一方をいつ使用しますか。
ドキュメントを読んでいると、DataContext を使用してバインドできると書かれていますが、ObservableCollection をスローしてもリストに何も表示されません。ItemsSource で同じコレクションをスローすると、正常に動作します。
コントロール(リストボックスを含む)は、の値をまったく使用しませんDataContext
。その目的は、データバインディングのコンテキストを提供することです。
ListBox
「myList」と「myData」があるとしましょうMyData
。タイプにはMyData
タイプのプロパティ「People」がありObservableCollection<Person>
、Person
タイプには文字列プロパティ「Forename」と「Surname」があります。
次のすべてが同等です:-
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で構成され、LayoutRootのDataContextにデータオブジェクトが割り当てられます。-
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
動的に生成されるそれぞれに、そのインスタンスが割り当てられます。これは、ForenameバインディングとSurnameバインディングがどのように機能するかを示しています。Person
Person
DataContext