2013-03-12 7 views
11

Dies ist eine häufige Situation in XAML-basierten Anwendungen (WPF/Silverlight/WinRT).Zugriff auf Parent's DataContext in Windows 8 Store-Apps

WPF Zugehöriger Link ->WPF Databinding: How do I access the "parent" data context?

RelativeSource mit AncestorType und Mode=FindAncestor kommt in der Regel in WPF zu retten.

Diese beiden fehlen in WinRT API. Wie kann ich auf die Eltern zugreifen (möglicherweise nicht sofort), DataContext?

(Ich bin bewusst, TemplateBinding und ElementBinding aber beide sind nicht meist in DataTemplate geeignet).

Antwort

19

Ich hatte gerade das gleiche Problem. Vermutlich ist das üblich?

Hier ist eine grobe Lösung, die funktioniert: in verschachteltem Elemente

  • Bind die Tag-Eigenschaft eines Top-Level-Elements an die Datacontext

    <Grid Name="gridTop" Tag="{Binding}" /> 
    
  • Bind die Eigenschaft, die Sie über Element mögen, dh

    {Binding Tag.SomeProp, ElementName=gridTop} 
    
+1

Gute Empfehlung, aber das ist [ElementBinding] (http://www.rhyous.com/2010/04/13/tutorial-binding-one-element-property-to-another/). Es funktioniert nicht innerhalb [DataTemplate] (http://sblanco.wordpress.com/2010/01/29/wpf-bind-to-a-parent-datacontext-from-within-a-datatemplate/). Angebrachtes Verhalten scheint der richtige Weg zu sein. – Tilak

+1

Es funktioniert in DataTemplate - Sie binden an das Tag des (übergeordneten) Elements, das einen Verweis auf den übergeordneten DataContext hat. Ich benutze dies die ganze Zeit von innerhalb von DataTemplate-Elementen, um an den Top-Level-DataContext zu binden. – LMK

+11

Sie können dies vereinfachen, indem Sie das Tag entfernen und den Datenkontext direkt verwenden {Binding DataContext.SomeProp, ElementName = gridTop} – oXeNoN

1

ElementName Bindung ist immer noch möglich und könnte in Ihrem Fall funktionieren. Andernfalls müssten Sie ein angehängtes Verhalten implementieren.

0

Es gibt mehrere Möglichkeiten, wie Sie mit diesem Problem umgehen können:

Elementbindung ist der am häufigsten verwendeten Ansatz, wie Filip hingewiesen.

Sie könnten visueller Baum gehen, bis Sie die Eltern finden. Das macht FindAcestor intern. Sie könnten es in Verhalten für die einfache Wiederverwendung verkleiden.

Wenn Sie Ansichtsmodelle verwenden, können Sie Nachrichten anstelle von Bindungen verwenden, oder Sie könnten jedem untergeordneten Ansichtsmodell einen übergeordneten Kontext hinzufügen.

Die Auswahl der besten Lösung hängt von Ihren spezifischen Umständen ab.