12

初めての Silverlight アプリを作成しています。2 つのラベルを持つ列を持つデータグリッドがあります。ラベルについては、IValueConverter を使用してデータを条件付きでフォーマットしています。

ラベルの「コンテンツ」は次のように設定されています。

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

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

私の IValueConverterのConvertメソッドは次のとおりです。

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

だから私がやりたいのは、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 に渡すにはどうすればよいですか?

4

6 に答える 6

7

リテラル以外をソリューションに渡すことはできないためConverterParameter、オブジェクト全体をコンバーターに渡すと、コンバーター内からすべてのプロパティにアクセスできます。

したがって、コードは次のようになります(オブジェクトが呼び出されたと仮定します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}}"

コンバーターに直接バインドしているように見えますが、実際にはそうではありません。を指定せずにデータ コンテキストにバインドしているPathので、すべてにアクセスできます。

ソース

于 2010-12-08T14:19:03.143 に答える
2

私も同じ問題を抱えていて、その上で眠らなければなりませんでした。Converterは、Binding値を介してデータを取得する際に「ワンショット」を取得するようです。

したがって、Binding値を複雑なクラスにします。MV-VMを使用している場合は、とにかくデータシェーピングを行う必要があるため、コンバーターに必要な表示値とその他のデータを含めることで、Binding値を「より効果的に」しました(必要に応じて、含まれるクラスを作成しました)。

次に、ConverterParametersをValue型リテラルとして渡すという制限があるため、Converterを「もっと頑張る」必要があったので、コンバーターで列挙型を作成し、Convertルーチンでよりエレガントにするためにリテラルをキャストします。

次にできることは、表示されている値と別のしきい値(チェックする)に基づいて、グリッドセルの色(ブラシ)と厚さを変更することです。

ソースコードは私のブログサイトにあり、そのSilverlight 3コードは疑似MV-VM方式でバインディングを使用しています(依存性注入はありませんが、その例ですよね?)

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

次に、.txtを削除します

于 2010-06-12T14:26:28.097 に答える
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();
    }
}
于 2011-01-23T23:19:21.063 に答える
0

コンバーターパラメーターをバインドする場合は、次を参照してください。http: //brandontruong.blogspot.com/2009/06/binding-for-converter-parameter.htmlこれは最もクリーンなソリューションではないかもしれませんが、シンプルで状況によっては役立つ場合があります

于 2011-09-26T09:09:42.213 に答える
0

あなたの問題を完全には理解していませんが、「要素名」とのバインディングを探していると思いますか?

例: http://www.wintellect.com/CS/blogs/jprosise/archive/2009/03/27/silverlight-3-s-new-element-data-binding.aspx

于 2009-08-28T11:03:48.800 に答える