我正在编写我的第一个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?
答案 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
,因此您可以使用访问整个内容。
答案 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”的绑定?
答案 5 :(得分:0)
如果你想绑定转换器参数,请看一下:http://brandontruong.blogspot.com/2009/06/binding-for-converter-parameter.html它可能不是最干净的解决方案,但它很简单,在某些情况下很有用