silverlight silverlight-4.0 datacontext itemssource

silverlight - Diferencia entre ItemsSource y DataContext en lo que respecta a ListBox



silverlight-4.0 (1)

Los controles (incluido el ListBox) no hacen nada con el valor de DataContext . Su propósito es proporcionar un contexto para enlaces de datos.

Supongamos que tiene un ListBox "myList" y un MyData "myData". El tipo MyData tiene una propiedad "Personas" de tipo ObservableCollection<Person> y, a su vez, el tipo Person tiene las propiedades de cadena "Forename" y "Apellido".

Todos los siguientes son equivalentes:

myList.ItemsSource = myData.People;

o

myList.DataContext = myData; myList.SetBinding(ItemsControl.ItemsSourceProperty, new Binding("People"));

o

myList.DataContext = myData.People; myList.SetBinding(ItemsControl.ItemsSourceProperty, new Binding());

Normalmente, los enlaces se configuran en Xaml y al DataContext de LayoutRoot se le asigna el objeto de datos: -

LayoutRoot.DataContext = myData;

puede tener el siguiente 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>

Notarás un par de cosas aquí. El DataContext de "myList" no está asignado en absoluto. En este caso, el árbol ancestro del control se camina hasta que se encuentra un antepasado que tiene un valor asignado a la propiedad DataContext .

Además, cada ListBoxItem generado dinámicamente para cada instancia de Person tiene esa instancia de Person asignada como su DataContext que es cómo funcionan los enlaces de nombre y apellido.

No estoy logrando la diferencia entre ItemsSource y DataContext. ¿Alguien puede explicarlo y respaldarlo con ejemplos? ¿Cuándo usaría uno o el otro?

Estoy leyendo los documentos y dice que puedo enlazar usando DataContext, pero arrojo un ObservableCollection y nada aparece en la lista. Si tiro la misma colección en ItemsSource, funciona bien.