将字段的值传递给Silverlight ConverterParameter

时间:2009-08-28 05:24:16

标签: datagrid silverlight-3.0 ivalueconverter

我正在编写我的第一个Silverlight应用程序。我有一个数据网格,其列有两个标签,对于标签,我使用IValueConverter来有条件地格式化数据。

标签的“内容”设置如下:

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

所以我想做的是在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?

6 个答案:

答案 0 :(得分: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,因此您可以使用访问整个内容。

Source

答案 1 :(得分:6)

看起来你正试图绑定到ConverterParameter,我担心你不能。 ConverterParameter只能采用文字值,例如ConverterParameter ='Your string'

答案 2 :(得分:2)

我有同样的问题,不得不睡在上面。似乎转换器在获取数据时“一次性” - 通过Binding值。

因此,将Binding值设为复杂类。如果你正在使用MV-VM,你应该是数据整形,所以我通过在转换器中包含显示值和我需要的其他数据(如果你愿意创建一个包含的类),使得Binding值“更加努力”。

接下来,我需要让Converter'更加努力工作',其限制是将ConverterParameters作为Value类型文字传递,所以我在我的转换器中创建一个Enum,并在我的Convert例程中将文字转换为更多优雅。

我可以做的是根据显示的值和另一个阈值(我检查过)来改变网格单元格的颜色(画笔)和厚度。

源代码在我的博客网站上,其Silverlight 3代码使用伪M-V-VM方式绑定(没有依赖注入,但是嘿 - 这是一个例子,对吗?)

下载地址:http://www.martymazurik.com/file.axd?file=2010%2f6%2fHighlightGridCell.zip.txt

然后删除.txt

答案 3 :(得分: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();
    }
}

答案 4 :(得分:0)

我不完全确定我理解你的问题,但我认为你正在寻找与“elementname”的绑定?

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

答案 5 :(得分:0)

如果你想绑定转换器参数,请看一下:http://brandontruong.blogspot.com/2009/06/binding-for-converter-parameter.html它可能不是最干净的解决方案,但它很简单,在某些情况下很有用