2009-08-28 10 views
12

私は初めてのSilverlightアプリケーションを作成しています。私はラベルのために、私は条件付きでデータをフォーマットするためにIValueConverterを使用している2つのラベルを持つ列のDataGridを持っています。フィールドの値をSilverlight ConverterParameterに渡す

ラベルの "コンテンツ" のように設定されて

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

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

私IValueConverterの方法は、ある変換:だから何を

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 

I HomeScoreのコンバーターに、私はAwayScoreを渡したいと思っています。 ConverterParameter、AwayScoreの場合HomeScoreをコンバータに渡したいと思っています。いずれかのスコアのコンバータでは、私はフォーマットの目的のために他のスコアの値を知ることができる必要があります。

しかし、私はConverterParameterを別のフィールドにバインドする構文を理解できません。
私は次のことを試してみた:

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

しかし、それらのどれも動作するようには思えません。フィールド値をConverterParameterに渡すにはどうすればよいですか?

+0

に役立ちます引用符で囲まれていますが、コンバーターでは '{Binding SomeOtherProperty}'の文字列を返します。私は何かが欠けていたか? :(PS。私はSilverlightの3を使用していますMultibindコンバータで –

+0

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

答えて

6

が見えます。 ConverterParameterはリテラル値のみを取ることができます。たとえば、ConverterParameter = 'Your string'

+0

はい – eidylon

+3

あなたがまだそれを理解していないのであれば、一重引用符はあなたの質問コードに欠けているものです – Aligned

2

私は同じ問題を抱えていました。コンバータは、データを取得する際にBinding値を使用して「ワンショット」を取得したようです。

したがって、Binding値を複雑なクラスにします。 M-V-VMを使用している場合は、とにかにデータ整形を行う必要があります。そのため、表示値と必要なデータをコンバーターに含めて(バインドされたクラスを作成して)Binding値を「もっと厳しくしました」。

次にConverterParametersをValue型のリテラルとして渡すという制限があるため、Converterの作業をもっと困難にする必要があったため、コンバータでEnumを作成し、Convertルーチンでより多くのelegancyのためにリテラルをキャストしました。

次に、表示される値と(私がチェックする)別のしきい値に基づいて、グリッドセルの色(ブラシ)と太さが変わります。

ソースコードは、擬似MV-VM方式で結合使って自分のブログサイト、そのSilverlight 3のコードの上にある(?なし依存性注入、ちょっと - 右、その一例)

ダウンロード時:http://www.martymazurik.com/file.axd?file=2010%2f6%2fHighlightGridCell.zip.txt

あなたはConverterParameterにソリューションをリテラルが、何かを渡すことができないので、その後の.txt

+0

これはこれまでのところ最良のアプローチだと思います。複雑さの責任を所属するオブジェクトに委譲+1 –

7

を削除するには、コンバータにオブジェクト全体を渡すために、その後、あなたはそれのすべてがコンバータ内からのプロパティのアクセス可能です。

だからあなたのコードは、(あなたのオブジェクトが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 

(コード内の細部の不足のために謝罪)

次に、あなたのXAMLは

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

なりNOTE明らかにコンバータに直接バインドしている間は、実際にはそうではありません。 Pathを指定せずにデータコンテキストにバインドしているので、アクセス全体を使用できます。コンテンツプロパティに全データオブジェクトをバインドして構築されたコンバータを使用すると、このオブジェクト・タイプを使用すると、コンバータ自体に必要なプロパティを解析期待する -

Source

+6

オブジェクトのプロパティが更新された場合、valuconverterは起動しません – Calanus

+0

明快にするために、@ChrisF、あなたはバインドしていませんあなたのノートで言及したように、コンバーター。あなたは現在のdatacontext(Path =のような)にバインドしています、指定されたコンバータを使用します。コンバータへのバインドはナンセンスです。 –

+0

@Dercsár - 確かに。振り返ってみると、混乱しているのは省略形でした。 – ChrisF

2

ChrisFは私がに来ることができました唯一の解決策を持っています。

あなたは、コンバータのパラメータをバインドしたい場合は、これを見てい
<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(); 
    } 
}