将模板化项目绑定到DataTemplate中的Converter的Value属性

时间:2012-06-01 16:38:43

标签: silverlight xaml mvvm silverlight-4.0 datatemplate

我正在使用Silverlight 4。

我为DataGrid定义了一个DataTemplate,它允许我成功地显示我喜欢的值。我在这个DataTemplate中有一个Rating控件,它在Value属性上有一个转换器,如此...

<DataTemplate>
    <toolkit:Rating Value="{Binding Converter={StaticResource MyConverter}" ItemCount="5" />
</DataTemplate>

当我单步执行代码并进入转换器时,我看到value参数不是与模板呈现的行相对应的项,而是我的ViewModel,它是DataGrid本身的DataContext!

现在,如果我稍微调整一下,

<DataTemplate>
    <toolkit:Rating Value="{Binding SomeProperty Converter={StaticResource MyConverter}" ItemCount="5" />
</DataTemplate>

传递给MyConverter的值是DataTemplate呈现的项目的SomeProperty。

有谁知道为什么会这样?如何绑定模板引用的项而不是DataGrid的DataContext?

2 个答案:

答案 0 :(得分:0)

尝试"{Binding ., Converter={StaticResource MyConverter}"

答案 1 :(得分:0)

我想出来了。

在Silverlight的DataGrid的MeasureOverride阶段,我的转换器正在被调用。感觉就像DataGrid的MeasureOverride实现中的一个错误,忽略了

<DataGrid ItemsSource="{Binding MySource}"></DataGrid>

在此阶段绑定表达式相对于已定义的DataTemplate,并使用DataGrid的DataContext,这肯定会导致典型的Converter失败。

我现在的创可贴解决方案是在我的转换器实现中添加一个if语句,以确保我获得的值的类型是我所期望的,因此它传递了MeasureOverride。

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (value is ExpectedType)
        //do things
    else
       //return an instance of targetType
}

任何人都可以确认这是否仍然发生在SL5中?