Come cambiare dinamicamente ConverterParameter (o presente) di proprietà di un MultiBinding (o qualsiasi altro) delle risorse in fase di esecuzione?

StackOverflow https://stackoverflow.com/questions/1272049

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!

codice

Ho 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

È stato utile?

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 3 TextBlocks 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top