2009-07-21 4 views
5

Ho un DataTemplate che sto utilizzando come CellTemplate per un GridViewColumn.WPF non mi consente di mettere un'associazione sul percorso di un'associazione - c'è un altro modo?

voglio scrivere qualcosa di simile per la DataTemplate:

<DataTemplate 
    x:Key="_myTemplate"> 
    <TextBlock 
     Text="{Binding Path={Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GridViewColumn}}, Path=Header}}" /> 
</DataTemplate> 

mio GridView è associato a un DataTable, e voglio associare alla colonna del DataTable il cui nome è uguale alla intestazione della GridViewColumn è collegato a DataTemplate. [Spero che abbia senso!]

Sfortunatamente, questo non funziona. Ricevo una XamlParseException: "A" Binding "non può essere impostato sulla proprietà" Path "del tipo" Binding ". Un" Binding "può essere impostato solo su DependencyProperty di DependenceyObject."

Come posso configurarlo?

Modifica (elevando commento di daNm alla domanda)

Io fondamentalmente bisogno di un DataTemplate il cui legame è determinato dal DataContext e quale colonna la DataTemplate è attaccato. C'è un'alternativa?

+0

Non certo perché hai codificato questo RelativeSource come Silverlight non è supportato in Silverlight – AnthonyWJones

+0

Mi dispiace, Anthony. Non ero a conoscenza che Silverlight non supportasse RelativeSource. Non sono sposato con RelativeSource, però, quindi se c'è una soluzione XAML alla mia domanda che non la usa, sarei comunque interessato a sentirla. – devuxer

risposta

0

Non è possibile assegnare un binding a qualsiasi proprietà. La proprietà deve essere del tipo Binding o essere implementata come proprietà di dipendenza sull'oggetto.

La proprietà Path della classe Binding è di tipo PropertyPath e Binding non implementa la proprietà Path come proprietà di dipendenza. Quindi non è possibile legare dinamicamente il percorso nel modo in cui si sta tentando di farlo.

Modifica

Fondamentalmente si desidera incorporare i metadati nel vostro dati associati che guida la configurazione del DataTemplate. Questo non può essere fatto solo in XAML. Avresti bisogno di almeno un po 'di supporto dal codice.

Mi sembra che l'approccio migliore sarebbe utilizzare un ViewModel. Ciò rende il binding in XAML straight-forward e spinge questa decisione "what to bind with what" nel codice di ViewModel.

+0

Grazie, ma la mia domanda è se c'è un altro modo per raggiungere il mio obiettivo utilizzando XAML. Fondamentalmente ho bisogno di un DataTemplate il cui binding è determinato da DataContext * e * a cui è collegata la DataTemplate. C'è un'alternativa? – devuxer

+0

@Anthony, Thx per la modifica. La mia domanda in realtà è uscita da una discussione su come mostrare i dati pivot in un GridView in cui il numero di colonne e i percorsi di associazione associati non sono noti fino a quando il database non viene interrogato in fase di runtime. Sto usando MVVM e ho un ViewModel, ma la mia soluzione iniziale era di generare DataTemplates dinamicamente nel codebehind usando XamlReader.Load(). Questo è stato criticamente criticato come "non buono" (vedi http: // StackOverflow.it/questions/1156336/is-it-configure-to-configure-a-gridview-to-show-pivoted-data-using-static-xaml-if), quindi il mio tentativo di un DataTemplate più flessibile. – devuxer

+1

@Anothony (continua), Quindi il mio DataContext è impostato sul mio ViewModel, e il mio ItemsSource di GridView è impostato su una proprietà del ViewModel (un DataTable), ma suppongo che non capisco come ViewModel possa risolvere il problema di come mappare ogni GridViewColumn alla colonna DataTable corretta senza ricorrere a XAML caricato in modo dinamico. – devuxer

0

Non vuoi solo questo?

{Binding Path=Header, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GridViewColumn}}} 
+0

Credo che quello che hai qui imposterà la casella di testo di ogni singola cella nella colonna per essere uguale all'intestazione. Quello che voglio è associare GridViewColumn alla DataColumn appropriata di un DataTable, in cui i nomi delle colonne nel DataTable corrispondono al valore dell'intestazione di GridViewColumns. Quindi, se l'intestazione per una GridViewColumn era "Column3", questa colonna verrebbe associata alla colonna denominata "Column3" nel DataTable. Spero che abbia senso :) – devuxer

+0

Penso che avrai problemi a farlo nel modo in cui stai provando, dal momento che GridViews è basato su righe, cioè una cella è un figlio o una riga, non una colonna. Prova a guardare questa serie di post di Dr. WPF, potrebbe aiutare a chiarire qualche confusione: http://drwpf.com/blog/ItemsControlSeries/tabid/59/Default.aspx. Una regola empirica di base per WPF, se si sta cercando di utilizzare qualcosa in un modo che non è stato progettato per le cose diventerà incredibilmente difficile, ma di solito hanno un modo semplice per farlo già fatto. Sta trovando il modo facile che è la parte difficile ... –

+0

@Bryan Darò un'occhiata, grazie! – devuxer

Problemi correlati