Come cambiare dinamicamente ConverterParameter (o presente) di proprietà di un MultiBinding (o qualsiasi altro) delle risorse in fase di esecuzione?
Domanda
Sono nuovo di WPF e XAML. trovo soluzioni della maggior parte dei problemi (in altre lingue) con la ricerca qui n là o googling intorno, ma questo mi ha fatto impazzire. ho cercato molto su google e passato in rassegna molti forum, ma sembra che questa volta ho incontrato una vera sfida!
codiceHo seguito in 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 è basato sul valore di ConverterParameter che può essere uno dei seguenti: FirstNameFirst, LastNameFirst, OnlyFirstName, OnlyLastName, Iniziali (ci sono alcuni più, ma per semplicità , cerchiamo di non li 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" in modo da tutti i 20 riferimenti mostreranno nome solo in questo modo.)
Ora la mia domanda è posso renderla più "generalizzata" in modo che la posso impostare il valore di ConverterParameter in modo dinamico? vale a dire che posso avere più TextBlocks in grado di visualizzare nome e cognome 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 me ogni possibile soluzione.
Grazie in anticipo.
Nota: Ho avuto l'idea originale da qui . L'esempio di lavoro simile si trova msdn.microsoft.com/en-us/library/ms771336.aspx.
Tags: WPF vincolante XAML StaticResource DynamicResource
Soluzione
Per essere in grado di cambiare la modalità di visualizzazione utilizzato su ogni istanza, penso che avrei fatto qualcosa di simile:
- Crea una
UserControl
con 3TextBlock
s per la visualizzazione dei 3 parti del nome. - Aggiungi oggetti da quanto sopra per le parti del nome di essere bersaglio di vincolanti.
- Aggiungi una proprietà per il modo 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 proprietà First
, Middle
e Last
. Poi si potrebbe ancora utilizzare un unico MultiBinding
a quella proprietà. La differenza sarebbe che il vostro NameConverter
avrebbe preso i 3 pezzi e restituire una nuova struct 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 è quella di disaccoppiare la formattazione dei dati.
La parte che ha fatto scattare le cose dichiarava uno MultiBinding
come una risorsa. Di solito, ci sarebbe un MultiBinding
su ogni TextBlock
si sono vincolanti per modo che si può cambiare il ConverterParameter
per ogni caso.
Modifica 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 necessaria di essere il bersaglio di un DynamicResource
o Binding
.