37 Stimmen

Warum sind DataContext und ItemsSource nicht redundant?

In WPF Databinding, ich verstehe, dass Sie haben DataContext das einem Element mitteilt, an welche Daten es gebunden werden soll und ItemsSource die "die Bindung übernimmt".

Aber z.B. in diesem einfachen Beispiel scheint es nicht so, dass ItemsSource seither nichts Nützliches mehr tut, was sollte das Element sonst noch mit dem DataContext außer binden dazu ?

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

Und in komplexeren Beispielen von ItemsSource haben Sie Pfad und Quelle, die in das Gebiet von DataContext .

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

Wie kann man diese beiden Konzepte am besten verstehen, um zu wissen, wann und wie man sie in verschiedenen Kodierungsszenarien anwendet?

25voto

Kent Boogaart Punkte 170094

DataContext ist nur ein praktischer Weg, um einen Kontext für Bindungen für die Fälle, in denen eine explizite Quelle nicht angegeben ist, zu erhalten. Sie wird vererbt, was dies möglich macht:

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

Hier, Customers y Orders sind Sammlungen auf der Ressource "Daten". In Ihrem Fall hätten Sie dies einfach tun können:

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

da kein anderes Steuerelement den eingestellten Kontext benötigt.

1 Stimmen

Danke, der zweite Teil Ihrer Antwort ist die Verbindung, die ich zwischen DataContext und Source vermisst habe. Man kann es sich also so vorstellen: <ListView ItemsSource="{Binding DataContext={StaticResource customers}}"> (eigentlich frage ich mich, warum WPF nicht einfach diese Syntax verwendet)

1 Stimmen

@Edward: Vielleicht, aber es gibt auch andere Arten von Quellen, wie RelativeSource und ElementName. Sehen Sie sich die API-Dokumente für die Binding-Klasse an.

6voto

Nimesh Patel Punkte 61

Die ItemsSource-Eigenschaft wird direkt mit dem Sammlungsobjekt ODER der Sammlungseigenschaft des Bindungsobjekts der DataContext-Eigenschaft verbunden.

Exp:

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

Class ChildRoot
{
   public string childName;
}

Es gibt zwei Möglichkeiten, das ListBox-Steuerelement zu binden:

1) Bindung mit 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) Bindung mit ItemSource:

ItemsSource Eigenschaft nimmt immer Sammlung. Hier müssen wir die Sammlung von Root binden

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

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

Im ersten Beispiel haben wir binden DataContext, die Objekt innerhalb dieses Objekts haben wir Sammlung, die wir mit ItemSource Eigenschaft gebunden, wo im zweiten Beispiel haben wir direkt binden ItemSource Eigenschaft mit Sammlung Objekt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X