¿Por qué DataContext y ItemsSource no son redundantes?


En WPF Databinding, entiendo que tienes DataContext que le dice a un elemento a qué datos se va a vincular y ItemsSource que "hace la encuadernación".

Pero, por ejemplo, en este simple ejemplo, no parece que ItemsSource está haciendo algo útil, ya que, ¿qué otra cosa desea que el Elemento que hacer para el DataContext, excepto enlazar a?

<ListBox DataContext="{StaticResource customers}" 
         ItemsSource="{Binding}">

Y en ejemplos más complejos de ItemsSource, tienes el Camino y la Fuente que parece invadir el territorio de DataContext.

ItemsSource="{Binding Path=TheImages, Source={StaticResource ImageFactoryDS}}"

¿Cuál es la mejor manera de entender estos dos conceptos para saber cuándo y cómo aplicar cada uno de ellos en varios escenarios de codificación?

Author: Colonel Panic, 2009-04-27

2 answers

DataContext es solo una forma práctica de recoger un contexto para los enlaces para los casos en los que no se especifica una fuente explícita. Se hereda, lo que hace posible hacer esto:

<StackPanel DataContext="{StaticResource Data}">
    <ListBox ItemsSource="{Binding Customers}"/>
    <ListBox ItemsSource="{Binding Orders}"/>
</StackPanel>

Aquí, Customers y Orders son colecciones en el recurso llamado "Data". En tu caso, podrías haber hecho esto:

<ListBox ItemsSource="{Binding Source={StaticResource customers}}"/>

Ya que ningún otro control necesitaba el conjunto de contexto.

 24
Author: Kent Boogaart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-27 15:04:26

La propiedad ItemsSource se vinculará directamente con el objeto collection O la propiedad collection del objeto binding de la propiedad DataContext.

Cad:

Class Root
{
   public string Name;
   public List<ChildRoot> childRoots = new List<ChildRoot>();
}

Class ChildRoot
{
   public string childName;
}

Habrá dos formas de enlazar el control ListBox:

1) Enlace con DataContext:

    Root r = new Root()
    r.Name = "ROOT1";

    ChildRoot c1 = new ChildRoot()
    c1.childName = "Child1";
    r.childRoots.Add(c1);

    c1 = new ChildRoot()
    c1.childName = "Child2";
    r.childRoots.Add(c1);

    c1 = new ChildRoot()
    c1.childName = "Child3";
    r.childRoots.Add(c1);

treeView.DataContext = r;

<TreeViewItem ItemsSource="{Binding Path=childRoots}" Header="{Binding Path=Name}">
<HierarchicalDataTemplate DataType="{x:Type local:Root}" ItemsSource="{Binding Path=childRoots}">

2) Enlace con ItemSource:

La propiedad ItemsSource toma colección siempre. aquí tenemos que enlazar colección de raíz

List<Root> lstRoots = new List<Root>();
lstRoots.Add(r);

<HierarchicalDataTemplate DataType="{x:Type local:Root}" ItemsSource="{Binding Path=childRoots}">

En el primer ejemplo tenemos bind DataContext que tiene objeto dentro de ese object tenemos collection que enlazamos con la propiedad ItemSource donde en el segundo ejemplo tenemos directamente bind ItemSource property with collection object.

 4
Author: Nimesh Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-01 02:55:03