2009-08-13 17 views
5

Sono nuovo di wpf e xaml. trovo soluzioni alla maggior parte dei problemi (in altre lingue) cercando qui o googling ma questo mi ha fatto impazzire. ho cercato molto su google e ho sfogliato molti forum, ma sembra che questa volta abbia incontrato una vera sfida!Come convertire dinamicamente la proprietà ConverterParameter (o qualsiasi) di una risorsa MultiBinding (o qualsiasi altra) in fase di runtime?

Ho seguente codice nel Window.Resources:

<my:NameConverter x:Key="NameConverter"/> 

<MultiBinding x:Key="CustomerFullNameBinding" 
       Converter="{StaticResource NameConverter}" 
       ConverterParameter="LastNameFirst"> 
    <Binding Path="FirstName" /> 
    <Binding Path="MiddleName" /> 
    <Binding Path="LastName" /> 
</MultiBinding> 

Il NameConverter classe restituisce il nome completo, combinando le singole parti del nome. Il valore di ritorno si basa sul valore di ConverterParameter che può essere uno dei seguenti: FirstNameFirst, LastNameFirst, OnlyFirstName, OnlyLastName, Iniziali (ci sono un paio di più, ma per semplicità, queste cose non si Consideriamo)

Questo codice funziona bene. Io uso seguente per ottenere il risultato:

<TextBlock Text="{DynamicResource CustomerFullNameBinding}"/> 

Tuttavia, il problema è che se io uso la risorsa CustomerFullNameBinding 20 volte nel mio codice (come mostrato abovw) tutti loro avrebbe mostrato il nome in un particolare formato . (Cioè Qui nella dichiarazione di CustomerFullNameBinding ho impostato ConverterParameter = "LastNameFirst" così tutti i 20 riferimenti mostrerà nome solo in questo modo.)

Ora la mia domanda è: posso fare più "generalizzata" in modo che Posso impostare il valore di ConverterParameter in modo dinamico? Ad esempio, posso avere più blocchi di testo che possono visualizzare il nome completo in diversi formati. So che è possibile se creiamo più risorse come segue:

<MultiBinding x:Key="CustomerFullNameBinding_FirstNameFirst" 
       Converter="..." ConverterParameter="FirstNameFirst"> 
     ...... 
</MultiBinding> 
<MultiBinding x:Key="CustomerFullNameBinding_LastNameFirst" 
       Converter="..." ConverterParameter="LastNameFirst"> 
     ...... 
</MultiBinding> 
<MultiBinding x:Key="CustomerFullNameBinding_OnlyFirstName" 
       Converter="..." ConverterParameter="OnlyFirstName"> 
     ...... 
</MultiBinding> 

... and so on ... 

Ma io non voglio che, 'coz che sarà davvero fare il mio codice troppo ingombranti, e la più importante è che ti Void concetto di riutilizzabilità delle risorse !

Si prega di suggerire qualsiasi possibile soluzione.
Grazie in anticipo.

Nota: Ho ricevuto l'idea originale da here. L'esempio di lavoro simile può essere trovato msdn.microsoft.com/en-us/library/ms771336.aspx.

Tags: WPF XAML StaticResource vincolanti

risposta

3

Per essere in grado di cambiare la modalità di visualizzazione utilizzato su ogni istanza, credo DynamicResource che avrebbero fatto qualcosa di simile:

  • Creare un UserControl con 3 TextBlock s per la visualizzazione delle 3 parti del nome.
  • Aggiungere proprietà a quanto sopra per le parti del nome da destinare al binding.
  • Aggiungere una proprietà per la modalità in cui visualizzare (FirstNameFirst, LastNameFirst, ecc.)

Quanto sopra richiede un binding per ciascuno dei pezzi del nome, quindi un modo per semplificare che sarebbe fare una singola proprietà sul UserControl di un tipo NameData dichiarata come una struttura con First, Middle, e Last proprietà. Quindi potresti ancora usare un singolo MultiBinding per quella proprietà. La differenza sarebbe che il tuo NameConverter prenderà i 3 pezzi e restituirà una nuova struttura NameData invece di una stringa formattata.

<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="LastNameFirst" /> 

<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="FirstNameFirst" /> 

<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="Initials" /> 

<!-- and so on... --> 

L'idea è di disaccoppiare la formattazione dai dati.

La parte che ha fatto lo sgancio era dichiarare uno MultiBinding come una risorsa. Di solito, ci sarà un MultiBinding su ogni TextBlock a cui si sta vincolando, in modo che sia possibile modificare ConverterParameter per ciascun caso.

Edit: So che voleva essere in grado di cambiare ConverterParameter, ma che non è proprio possibile a causa del 1 istanza di MultiBinding e ConverterParameter essendo una proprietà semplice piuttosto che un DependencyProperty, che sarebbe necessario per essere il bersaglio di un DynamicResource o Binding.

+0

Grazie mille per la rapida risposta. Sei vero. ConverterParameter è una proprietà semplice, non DependencyProperty. In realtà sono nuovo di WPF e talvolta dimentico anche i concetti di base! Avere un controllo utente associato a una risorsa dinamica che restituisce una struttura anziché una stringa è davvero una grande idea. Non l'ho provato, ma sono sicuro che funzionerà !! Grazie ancora!!! – mg007

Problemi correlati