27 votes

Pourquoi DataContext et ItemsSource ne sont-ils pas redondants?

Dans WPF Databinding, je comprends que vous avez DataContext ce qui indique un élément de quelles données il va se lier et ItemsSource qui "fait la liaison".

Mais par exemple dans cet exemple simple, il ne semble pas qu' ItemsSource est en train de faire quelque chose d'utile depuis, qu'est-ce que vous voulez l'Élément à faire pour l' DataContext sauf lier à elle?

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

Et dans les cas les plus complexes de l' ItemsSource, vous avez du Chemin et de la Source qui semble empiéter sur le territoire de l' DataContext.

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

Quelle est la meilleure façon de comprendre ces deux concepts à savoir quand et comment les appliquer à chacun d'entre eux dans diverses codage des scénarios?

19voto

Kent Boogaart Points 97432

DataContext est juste un moyen pratique de récupérer un contexte pour les liaisons pour les cas où une source explicite n'est pas spécifiée. Il est hérité, ce qui permet de faire ceci:

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

Ici, Customers et Orders sont des collections sur la ressource appelée "Données". Dans votre cas, vous auriez pu simplement faire ceci:

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

car aucun autre contrôle n'avait besoin de l'ensemble de contexte.

3voto

Nimesh Patel Points 11

Propriété ItemsSource sera lié à la collecte de l'objet directement OU collection de propriété de l'objet de liaison de la propriété DataContext.

Exp:

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

Class ChildRoot
{
   public string childName;
}

Il y aura deux façons de lier le contrôle ListBox:

1) la Liaison avec 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) la Liaison avec ItemSource:

Propriété ItemsSource prend collection toujours. ici, nous avons pour lier collection de Racine

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

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

Dans le Premier exemple, nous avons lier DataContext qui a de l'objet à l'intérieur de cet objet, nous avons une collection qui nous binded avec ItemSource propriété où dans le Deuxième exemple, nous avons lier directement ItemSource propriété avec un objet de collection.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X