2012-04-23 35 views
13

Ho giocato in giro con WPF per un bel po 'di tempo, ma per la prima volta oggi, avevo bisogno di un nido MultiBinding all'interno di un altro, qualcosa di simile:nidificati MultiBinding (s)

<MultiBinding> 
    <Binding />  
    <MultiBinding> 
     <Binding /> 
     <Binding /> 
    </MultiBinding> 
</MultiBinding> 

ottengo un'eccezione che indica che non è consentito dal framework:

XamlParseException è stata gestita: Aggiungere valore alla raccolta di tipo 'System.Collections.ObjectModel.Collection (System.Windows.Data.BindingBase)' ha generato un'eccezione.

Il InnerException è più esplicito:

BindingCollection non supporta gli elementi di tipo MultiBinding. È consentito solo il rilegatura.

Quindi scavando il web per ulteriori informazioni, mi sono imbattuto su this Microsoft Connect issue che è esattamente il mio problema.

Grazie per il feedback. WPF non supporta questo oggi. Questa funzione è stata richiesta per anni (più recentemente all'inizio di questo mese - vedere https://connect.microsoft.com/WPF/feedback/details/650164/nested-multibinding). Continueremo a considerare questo per le versioni future.

In questo momento ho fatto la pace che non sarò facile. Ho ancora bisogno di questo, , come posso nidificare MultiBindings?

+0

Che cosa è che si sta cercando di fare, che si desidera multibindings nido? –

+0

Sto convertendo valori booleani con ordini di precedenza complessi e mentre alcuni di essi sono già booleani, altri hanno bisogno di una conversione prima e quindi sono incorporati in altri 'IMultiValueConverter' (s). –

+0

Se i tuoi altri MultiValueConverters non hanno più di due valori di input, potresti invece usare un convertitore con un parametro ... oppure potresti usare un convertitore con un parametro complesso per inserire più valori, che è un po 'di lavoro, ma dovrebbe fare il trucco. Se ciò sembra fattibile, potrei postare un campione? –

risposta

0

utilizzare semplicemente uno multibinding e un MultiConverter.

o quello che preferisco esporre la tua condizione in una proprietà del tuo viewmodel/datacontext.

+8

Sì, ma questo ne sconfigge l'intero scopo, Se ho bisogno di creare un nuovo convertitore che combini solo altri convertitori, e dato che ne ho presi un centinaio ... Questo è un gran numero di piastre . –

+0

sì, ma funzionerebbe;) – blindmeis

+0

Effettivamente, ma sto cercando di riutilizzare quello che ho già;) –

1

Se stai legandosi a una stringa è possibile utilizzare StringFormat proprio come in questo esempio:

<TextBlock> 
    <TextBlock.Text> 
    <MultiBinding StringFormat="{}{0:0.###}/{1:0.###}" Mode="OneWay"> 
         <Binding ElementName="This" Path="AggregatedDocDetail.ConfirmedQty"></Binding> 
         <Binding ElementName="This" Path="AggregatedDocDetail.Qty"> </Binding> 
     </MultiBinding> 
    </TextBlock.Text> 
    </TextBlock> 
+0

Sono vincolante per i booleani (vedere i commenti della domanda) e anche per gli POCO. –

4

Se si dispone di un convertitore che prende un parametro, si può fare qualcosa di simile:

  • creare una classe per il passaggio dei dati "fissi" per il convertitore
  • Aggiungere DependencyProperties alla classe (in modo che è possibile associare i valori in XAML)
  • Nel vostro XAML, utilizzare un legame con un convertitore invece di un MultiBinding, qualcosa di simile:

    <MultiBinding> 
        <Binding Source="SomeObject" Path="CoreValue" Converter="{StaticResource YourNewConverter}"> 
         <Binding.ConverterParameter> 
          <ns:ParameterClass Value1="{Binding Parameter1}" Value2="{Binding Parameter1}" /> 
         </Binding.ConverterParameter> 
        </Binding> 
    .... 
    

La limitazione è che (per quanto ne so) il valore sarà ricalcolato solo se CoreValue modifiche - ha vinto 'rebind automaticamente se i parametri del convertitore cambiano.

(Ci scusiamo per eventuali errori, sto scrivendo questo senza il beneficio di VS per testare in ...)

+0

Penso che sia un'idea valida, ma ci vorrebbe troppo tempo per ottimizzare con l'ereditarietà di DataContext in modo che le proprietà di ParameterClass possano essere associate. –

4

Mi rendo conto che questa è una vecchia questione ora, ma ho appena colpito esattamente lo stesso problema l'OP.Fortunatamente nel mio caso potevo associare a un elemento secondario in cui il risultato del multi-binding era già stato calcolato, ma mi ha fatto pensare ...

Una soluzione (anche se non molto pulita) sarebbe scrivere il valore dell'associazione multi-valore in una proprietà 'di riserva' come il 'Tag' di un elemento che puoi quindi fare riferimento negli altri bind multi-valore specificando l'attributo 'ElementName'.

Se è necessaria più di una singola associazione a più valori nidificata, è possibile creare un oggetto "falso" con alcune proprietà di dipendenza su di esso per memorizzare più risultati intermedi.

Peccato che Microsoft non è implementare un sistema correttamente nidificato ...