2009-08-28 2 views
12

Sto scrivendo la mia primissima app Silverlight. Ho un datagrid con una colonna che ha due etichette, per le etichette, sto usando un IValueConverter per formattare i dati condizionatamente.Valore pass di un campo in Silverlight ConverterParameter

del marchio "Contenuto" è impostato come tale:

Content="{Binding HomeScore, Converter={StaticResource fmtshs}}" 

e

Content="{Binding AwayScore, Converter={StaticResource fmtshs}}" 

Il Convert metodo della mia IValueConverter è tale:

Public Function Convert(
    ByVal value As Object, 
    ByVal targetType As System.Type, 
    ByVal parameter As Object, 
    ByVal culture As System.Globalization.CultureInfo) As Object 
Implements System.Windows.Data.IValueConverter.Convert 

    Dim score As Long = value, other As Long = parameter 

    Return If(score < 0, "", 
     If(score - other > 5, (other + 5).ToString, score.ToString) 
    ) 

End Function 

così quello che voglio fare è nel convertitore per HomeScore, voglio passare AwayScore al ConverterParameter, e per AwayScore voglio passare il HomeScore al convertitore. Nel convertitore per entrambi i punteggi devo essere in grado di conoscere il valore dell'altro punteggio per scopi di formattazione.

Ma non riesco a capire la sintassi per legare il ConverterParameter ad un altro campo.
Ho provato la seguente:

Content="{Binding HomeScore, Converter={StaticResource fmtshs}, ConverterParameter=AwayScore}" 
Content="{Binding HomeScore, Converter={StaticResource fmtshs}, ConverterParameter={AwayScore}}" 
Content="{Binding HomeScore, Converter={StaticResource fmtshs}, ConverterParameter={Binding AwayScore}}" 

Ma nessuno di coloro che sembrano funzionare. Come posso passare un valore di campo a ConverterParameter?

+0

Ho provato il singolo citazioni ma nel convertitore mi dà una stringa di '{Binding SomeOtherProperty}'. Mi sono perso qualcosa? :(PS. Sto usando Silverlight 3. –

+0

Guardate Convertitori MultiBind http://stackoverflow.com/questions/377841/what-should-the-converter-parameter-be-for-this-binding – Rauld

risposta

6

Sembra che si sta cercando di legarsi ad un ConverterParameter, che temo non si può. ConverterParameter può solo prendere valori letterali, ad es. ConverterParameter = 'Your string'

+0

Sì , questo era esattamente quello che stavo/sto cercando di fare. – eidylon

+3

se non l'hai ancora capito, le virgolette singole sono ciò che ti manca nel tuo codice di domanda. – Aligned

2

Ho avuto lo stesso problema e ho dovuto dormire su di esso. Sembra che il convertitore ottenga "un colpo" per ottenere i dati - tramite il valore Binding.

Pertanto, rendere il valore Binding una classe complessa. Se si utilizza M-V-VM, si dovrebbe comunque eseguire la modellazione dei dati, quindi ho reso il valore di Binding "più difficile" includendo il valore di visualizzazione e gli altri dati necessari nel convertitore (creato una classe contenuta, se necessario).

Successivamente, avevo bisogno di far funzionare il convertitore più duro, con la sua limitazione di passare ConverterParameters come valori letterali di tipo Value, quindi creo un Enum nel mio convertitore e lancio il letterale su di esso per una maggiore eleganza nella mia routine di conversione .

Ciò che potrei fare è variare il colore (pennello) e lo spessore di una cella della griglia, in base al valore visualizzato e un altro valore di soglia (che controllo rispetto).

Il codice sorgente è sul mio blog, il suo codice di Silverlight 3 utilizzando vincolante in una pseudo MV-VM Fashion (senza iniezione di dipendenza, ma hey - il suo esempio, giusto?)

il download all'indirizzo: http://www.martymazurik.com/file.axd?file=2010%2f6%2fHighlightGridCell.zip.txt

quindi rimuovere il .txt

+0

Penso che questo sia l'approccio migliore finora. Delega la responsabilità della complessità nell'oggetto a cui appartiene +1 –

7

Come non si può passare nulla, ma un valore letterale nella ConverterParameter la soluzione è quella di passare l'intero oggetto nel convertitore e poi si può accedere a tutte le sue proprietà all'interno del convertitore.

Così il codice diventa (supponendo che l'oggetto si chiama Match):

Public Function Convert(
    ByVal value As Object, 
    ByVal targetType As System.Type, 
    ByVal parameter As Object, 
    ByVal culture As System.Globalization.CultureInfo) As Object 
Implements System.Windows.Data.IValueConverter.Convert 

    Dim match As Match = value 

    ' Do stuff with match' 

End Function 

(Ci scusiamo per la mancanza di dettagli nel codice)

Allora il tuo XAML diventa

Content="{Binding Converter={StaticResource fmtshs}}" 

NOTA Mentre apparentemente si sta vincolando direttamente al convertitore, non è in realtà il caso. Si sta vincolando al contesto dei dati senza specificare un Path in modo da poter utilizzare l'accesso al tutto.

Source

+6

Il problema con questo però è che se una proprietà sull'oggetto viene aggiornata, il valueconverter non si attiva – Calanus

+0

Solo per chiarezza: @ChrisF, non sei vincolante per il convertitore, come hai menzionato nella tua NOTA. Stai vincolando al datacontext corrente (come Path =.), usando il convertitore dato. Il legame con il convertitore non ha senso. –

+0

@ Dercsár - anzi. Era una scorciatoia che a posteriori è fonte di confusione. – ChrisF

2

ChrisF ha l'unica soluzione sono stato in grado di venire - Associare l'intero oggetto di dati alla proprietà dei contenuti e utilizzando un convertitore incorporato aspettarsi questo tipo di oggetto analizzare le proprietà che vi interessano nella convertitore stesso .

<sdk:DataGridTextColumn Header="Report Name" Binding="{Binding Mode=OneTime, Converter={StaticResource ReportNameDateQuarterConverter}}" /> 


/// <summary> 
/// Gets Exposure Report Name Quarter Number formatted from Report.Date and Report.Name 
/// </summary> 
public class ReportNameDateQuarterConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     string qStr = "Quarter "; 
     if (value != null && value.GetType() == typeof(Report)) 
     { 
      switch (((Report)value).Date.Month) 
      { 
       case 1: 
       case 2: 
       case 3: 
        return qStr + "1 " + ((Report)value).Name; 
       case 4: 
       case 5: 
       case 6: 
        return qStr + "2 " + ((Report)value).Name; 
       case 7: 
       case 8: 
       case 9: 
        return qStr + "3 " + ((Report)value).Name; 
       case 10: 
       case 11: 
       case 12: 
        return qStr + "4 " + ((Report)value).Name; 
       default: 
        return qStr + "? " + ((Report)value).Name; 

      } 
     } 
     return qStr + "? " + ((Report)value).Name; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
}