2009-11-02 7 views
6

Ho un set di controlli legati ai dati, su cui vorrei aggiungere programmatori ai binding. Attualmente sono in grado di scorrere l'albero visivo per trovare i controlli con i binding e aggiungere anche i miei validatori a questi controlli. Ma per specificare ulteriormente quali controlli dovrebbero avere convalida specifica, volevo usare gli stili. Quindi il mio XAML si presenta così:Dato un DependencyObject WPF in stile, come posso ottenere lo Style Key nel codice?

<TextBox Name="someTextBox" Style="{StaticResource optionalNumericTextBox}" /> 

Qui, lo stile optionalNumericTextBox serve sia l'aggiunta di un modello di errore di convalida e come decoratore per indicare che questo testo dovrebbe avere il validatore numerico facoltativo applicato.

Il problema si verifica quando sto attraversando l'albero visivo, si scopre un controllo con i collegamenti e quindi è necessario determinare lo stile in uso. Attualmente Ho provato

dependencyObject.GetValue(FrameworkElement.StyleProperty) 

che mi dà a Style oggetto, ma per quanto ne so, questo oggetto non porta il valore 'optionalNumericTextBox'. È persino possibile determinare la chiave o queste informazioni sono perse nel lettore XAML?

risposta

5

Quando si utilizza StaticResourceExtension, queste informazioni vengono perse al momento della compilazione durante la conversione di XAML in BAML. D'altra parte, l'utilizzo di DynamicResourceExtension mantiene la chiave in modo che la risorsa possa essere risolta in fase di runtime. Per arrivare alla chiave, è necessario utilizzare ReadLocalValue():

//this gets the Style 
var s = textbox.GetValue(TextBox.StyleProperty); 
//this gets a ResourceReferenceExpression 
var l = textbox.ReadLocalValue(TextBox.StyleProperty); 

Il problema è, ResourceReferenceExpression è un tipo interno, quindi è necessario utilizzare la reflection per estrarre la chiave.

In alternativa a tutto questo, hai considerato il dirottamento della proprietà Tag?

<Style x:Key="optionalNumericTextBox" TargetType="TextBox"> 
    <Setter Property="Tag" Value="optionalNumericTextBox"/> 
</Style> 

Poi il codice può semplicemente controllare la proprietà Tag sul TextBox.

+0

Grande consiglio lì, utilizzando un setter di proprietà. In realtà mi ha indirizzato verso l'utilizzo di una proprietà associata al posto del Tag. Quindi ora uso qualcosa del tipo: Funziona come un fascino! –

Problemi correlati