2010-01-18 12 views

risposta

9

Io non sono a conoscenza di alcun modo (non kludgy) per fare questo: il DataTemplateSelector viene chiamato quando WPF ha bisogno di selezionare il modello, e questa è una decisione una tantum per quanto WPF è ha riguardato. (Puoi blandirlo facendo in modo che WPF ritenga che il contenuto sia cambiato, ad esempio impostando il contenuto su null e poi di nuovo indietro - penso che funzionerebbe ma non l'ho testato - ma questo è piuttosto brutto!) Se c'è un bel modo per farlo anch'io sarei interessato a saperlo!

Tuttavia, esiste un modo alternativo per modificare la modalità di visualizzazione del contenuto che lo esegue l'aggiornamento in risposta alle modifiche dei dati, e cioè tramite i trigger. È possibile utilizzare DataTriggers nella raccolta DataTemplate.Triggers per mostrare e nascondere elementi in base ai dati del contenuto. Per cambiare l'intero display, potresti ad es. imposta due rendering in una griglia e utilizza i trigger per controllare quale è visibile. Si può persino creare un modello di dati come ContentControl e utilizzare un trigger per modificare ContentTemplate. Ovviamente ciò dipende dai criteri per la modifica del modello delle proprietà associabili, il che potrebbe non essere sempre il caso.

Here's some brief discussion of selectors vs. triggers, anche se in un contesto leggermente diverso.

+1

Sto avendo problemi di utilizzarlo con DataTrigger, si prega di dare un'occhiata: http://stackoverflow.com/questions/2090148/unable-to-set-contenttemplate-via-datatrigger – Shimmy

18

In ritardo alla festa, lo so. =)

Di fronte a questo problema, ho trovato più semplice per impostare in modo esplicito un nuovo TemplateSelector come

MyContentControl.ContentTemplateSelector = 
    new MyDataTemplateSelector(); 
+0

+1 non è mai troppo in ritardo! a differenza di altri post, che sono deprimenti, perché ti dicono che non c'è modo di fare ciò che vuoi! La tua soluzione funziona, e mi ha dato una grande idea, la posterò un po ', quando avrò tempo oggi. –

+0

Quello che ho effettivamente fatto, è memorizzare ogni presenter che chiama SelectTemplate (come riferimento debole) nel mio DataTemplateSelector e fornire un metodo statico per aggiornare tutti questi. – Jens

+0

bello! grazie ancora! –

7

Credo che io sono anche più tardi alla festa, ma per una diversa idea che possa aiutare qualcuno. ..

Si potrebbe anche provare a utilizzare uno ValueConverter sulla proprietà ContentControl s ContentTemplate anziché DataTemplateSelector.

È sufficiente disporre di una proprietà nel proprio DataContext da associare, ad esempio ScreenNumber. Quindi nello ValueConverter restituire DataTemplate associato allo ScreenNumber.

3

Analogamente alla risposta di Jens, anziché creare una nuova istanza, è possibile utilizzare l'istanza esistente di DataTemplateSelector.

var currentSelector = MyContentControl.ContentTemplateSelector;  
MyContentControl.ContentTemplateSelector = null; 
MyContentControl.ContentTemplateSelector = currentSelector; 
Problemi correlati