2009-08-28 4 views
12

Ich schreibe meine allererste Silverlight App. Ich habe ein Datagrid mit einer Spalte, die zwei Beschriftungen hat, für die Beschriftungen verwende ich einen IValueConverter, um die Daten bedingt zu formatieren.Wert eines Feldes an Silverlight Converter übergebenParameter

der "Inhalt" des Labels als solche festgelegt ist:

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

und

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

Die konvertieren Methode meiner IValueConverter ist so:

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 

Also, was ich Ich möchte im Converter für HomeScore, ich möchte AwayScore an die ConverterParameter und für AwayScore möchte ich den HomeScore an den Konverter übergeben. Im Konverter für beide Partituren muss ich den Wert der anderen Partitur für Formatierungszwecke kennen.

Aber ich kann die Syntax für die Bindung des ConverterParameter an ein anderes Feld nicht herausfinden.

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}}" 

Aber keiner von denen, zu funktionieren scheint:
Ich habe folgendes versucht. Wie übermittle ich einen Feldwert an den ConverterParameter?

+0

ich versucht habe, die Single- nützlich sein Zitate, aber im Konverter gibt es mir eine Kette von '{Binding SomeOtherProperty}'. Habe ich etwas vergessen? :(PS. Ich bin mit Silverlight 3. –

+0

Blick auf multiBIND Converters http://stackoverflow.com/questions/377841/what-should-the-converter-parameter-be-for-this-binding – Rauld

Antwort

6

Sieht aus wie Sie auf eine Converter zu binden sind versucht, die ich fürchte, Sie können es nicht. ConverterParameter kann nur literale Werte annehmen, zum Beispiel ConverterParameter = 'Ihre Zeichenfolge'

+0

Ja , das war genau das, was ich getan habe/versuche – eidylon

+3

Wenn du es noch nicht herausgefunden hast, sind die einfachen Anführungsstriche, was du in deinem Fragecode vermisst .. – Aligned

2

Ich hatte das gleiche Problem und musste darauf schlafen. Scheint der Converter bekommt "One-Shot" beim Abrufen der Daten - durch den Binding-Wert.

Also machen Sie den Binding-Wert eine komplexe Klasse. Wenn Sie M-V-VM verwenden, sollten Sie sowieso Daten-Shaping durchführen, also habe ich den Binding-Wert "härter arbeiten lassen", indem ich den Anzeigewert und die anderen Daten, die ich benötigt habe, in meinen Konverter mit einfügte.

Als nächstes musste ich den Konverter "härter arbeiten", mit seiner Beschränkung der Übergabe von ConverterParameters als Wert Typ Literale, so dass ich ein Enum in meinem Konverter, und werfen Sie das Literal für mehr Eleganz in meiner Convert-Routine .

Was ich dann tun könnte, ist die Farbe (Pinsel) und Dicke einer Grid-Zelle, basierend auf dem angezeigten Wert und einem anderen Schwellenwert (gegen den ich überprüfe).

Der Quellcode ist auf meinem Blog, sein Silverlight-3-Code-Bindung in einer MV-VM Mode Pseudo mit (keine Dependency Injection, aber hey - es ist ein Beispiel, nicht wahr?)

Download unter: http://www.martymazurik.com/file.axd?file=2010%2f6%2fHighlightGridCell.zip.txt

dann entfernen Sie die .txt

+0

Ich denke, das ist der beste Ansatz bisher delegiert die Verantwortung der Komplexität in das Objekt, wo es hingehört +1 –

7

Wie Sie nichts anderes als eine wörtliche in die ConverterParameter die Lösung passieren kann, ist das ganze Objekt in den Konverter passieren und dann kann man all seine Eigenschaften zugreifen aus dem Converter.

So Ihr Code wird (vorausgesetzt, Ihr Objekt Match genannt wird):

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 

(Entschuldigt Mangel an Details im Code)

Dann XAML wird

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

HINWEIS Während Sie scheinbar direkt an den Konverter gebunden sind, ist das nicht der Fall. Sie sind an den Datenkontext gebunden, ohne eine Path anzugeben, damit Sie auf das Ganze zugreifen können.

Source

+6

Das Problem dabei ist, dass, wenn eine Eigenschaft auf dem Objekt aktualisiert wird, der Wertkonverter nicht ausgelöst – Calanus

+0

Nur aus Gründen der Klarheit: @ChrisF, Sie sind nicht verbindlich der Konverter, wie Sie in Ihrem NOTE erwähnt haben. Sie sind an den aktuellen Datenkontext gebunden (wie Path =.), mit dem angegebenen Konverter. Bindung an den Konverter ist Unsinn. –

+0

@ Dercsár - in der Tat. Es war eine Kurzschrift, die im Nachhinein verwirrend ist. – ChrisF

2

ChrisF hat die einzige Lösung, die ich habe in der Lage zu kommen - zum Inhalt Eigenschaft das gesamte Datenobjekt zu binden und einen Converter gebaut dieser Objekttyp zu erwarten, dass die Eigenschaften, die Sie im Konverter selbst müssen analysieren .

<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(); 
    } 
}