2012-05-24 11 views
5

Il conferimento dei dati in fase di progettazione per il DataContext è facile con l'uso di d:DataContext ma per quanto riguarda le proprietà di controllo a cui fa riferimento con {TemplateBinding} o {RelativeSource TemplatedParent} da Style.Template?i dati di progettazione per ControlTemplate

Devo compilare il controllo con dati di esempio all'interno dell'evento costruttore/caricato quando DesignerProperties.GetIsInDesignMode(this) restituisce true? (Impossibile farlo poiché potrebbe interrompere la normale esperienza di progettazione).

E i controlli di terze parti che non posso modificare?

risposta

2

Per i miei propri controlli di solito faccio qualcosa di simile:

<Style x:Key="FooStyle> 
    <Setter Property="Template> 
    <Setter.Value> 
     <ControlTemplate TargetType="FooControl"> 
     <Grid d:DataContext="{d:DesignInstance FooDesignTimeData, IsDesignTimeCreatable=True}"> 
      ... guts of control template go here ... 
     </Grid> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

Dove "FooDesignTimeData" è una classe che fornisce dati in tempo di progettazione nella forma appropriata (che implementa l'interfaccia dalla vista del modello di esecuzione è una buona pratica Qui).

Non vedo perché questo non funzionerebbe anche per un controllo di terze parti. Potresti anche non dover ricomporre il controllo: potresti essere in grado di scappare semplicemente specificando il controllo di terze parti all'interno del tuo stile e assegnandogli un contesto di data e ora di progettazione come specificato sopra, ma non ho provato quello scenario. Presumo che si verificheranno tutti questi problemi perché si è costretti a utilizzare un controllo che non ha un'esperienza di progettazione ottimale (ad esempio fornendo un Vendor.Controls.Design.dll o Vendor.Controls.Expression.Design. file dll).

Per lavorare con TemplateBindings, non ho una soluzione eccezionale. Di solito creo una pagina di test che mostra il mio controllo e mi consente di cambiare i template. Durante l'integrazione avrai una vista aggiuntiva (all'interno dell'app o come app separata) che ti consente di creare e manipolare le istanze del controllo secondo necessità. L'azione trigger mirata a GoToStateAction di Blend SDK è spesso utile qui. Ad esempio, creare un pulsante per ogni stato visivo e quindi utilizzare il clic anche per attivare una transizione verso uno stato particolare. In questo modo puoi facilmente testare tutti i tuoi stati e le transizioni mentre sei vincolato a testare i dati. Hacky e non proprio i dati del tempo di progettazione, ma funziona.

+0

Come ho detto '{Binding}' è facile a causa di 'd: DataContext', ma sto cercando' {TemplateBinding} 's. –

+0

Hai provato a fare quanto sopra, ma assegnando d: DataContext come parte dello stile? Non ho una soluzione eccezionale per questa situazione: di solito creo una pagina di test che mostra il mio controllo e mi consente di cambiare i template. Hacky, ma funziona. –

+0

Questo sembra ragionevole. Devo provare questo me stesso. Ma devi modificare XAML per una versione di integrazione o puoi fornire anche il binding? –

Problemi correlati