22

私は、ItemsSource と DataContext の違いをよく理解していません。誰かがそれを説明し、例を挙げてバックアップできますか? どちらか一方をいつ使用しますか。

ドキュメントを読んでいると、DataContext を使用してバインドできると書かれていますが、ObservableCollection をスローしてもリストに何も表示されません。ItemsSource で同じコレクションをスローすると、正常に動作します。

4

1 に答える 1

45

コントロール(リストボックスを含む)は、の値をまったく使用しません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>

ここでいくつか注意します。「DataContextmyList」のはまったく割り当てられていません。この場合、プロパティに値が割り当てられている祖先が見つかるまで、コントロールの祖先ツリーがウォークされDataContextます。

また、インスタンスごとにListBoxItem動的に生成されるそれぞれに、そのインスタンスが割り当てられます。これは、ForenameバインディングとSurnameバインディングがどのように機能するかを示しています。PersonPersonDataContext

于 2010-07-06T14:51:45.950 に答える