2013-03-12 8 views
11

Questa è una situazione comune nelle app basate su XAML (WPF/Silverlight/WinRT).Come accedere a DataContext di Parent in Windows 8 store apps

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

RelativeSource con AncestorType e Mode=FindAncestor di solito viene in soccorso in WPF.

Entrambi mancano nell'API WinRT. Come accedere al genitore (potrebbe non essere uno immediato), DataContext?

(Sono a conoscenza di TemplateBinding e ElementBinding ma entrambi non sono adatti per lo più in DataTemplate).

risposta

19

Ho appena avuto lo stesso problema. Presumibilmente questo è comune ??

Ecco una soluzione grezza che funziona:

  • associare la proprietà Tag di un elemento di livello superiore per il DataContext

    <Grid Name="gridTop" Tag="{Binding}" /> 
    
  • associare la proprietà che si desidera tramite ElementName in elemento nidificato, cioè

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

Buon suggerimento, ma questo è [ElementBinding] (http://www.rhyous.com/2010/04/13/tutorial-binding-one-element-property-to-another/). Non funziona all'interno di [DataTemplate] (http://sblanco.wordpress.com/2010/01/29/wpf-bind-to-a-parent-datacontext-from-within-a-datatemplate/). Il comportamento allegato sembra essere la strada da percorrere. – Tilak

+1

Funziona all'interno di DataTemplate - si sta vincolando al Tag dell'elemento (padre), che ha un riferimento al DataContext padre. Lo uso sempre dagli elementi DataTemplate per collegarmi al DataContext di livello superiore. – LMK

+11

È possibile semplificare questo rimuovendo il tag e utilizzare direttamente il datacontext {Binding DataContext.SomeProp, ElementName = gridTop} – oXeNoN

1

Il collegamento ElementName è ancora possibile e potrebbe funzionare nel tuo caso. Altrimenti dovresti implementare un comportamento allegato.

0

ci sono diversi modi per affrontare questo problema:

vincolante ElementName è l'approccio più comune, come Filip sottolineato.

Si può camminare sull'albero visivo fino a trovare il genitore. Questo è ciò che FindAcestor fa internamente. Potresti vestirlo nel comportamento per un facile riutilizzo.

Se si utilizzano i modelli di visualizzazione, è possibile utilizzare i messaggi anziché i collegamenti oppure è possibile aggiungere contesto padre a ogni modello di vista figlio.

La scelta della soluzione migliore dipende dalle circostanze specifiche.