我正在使用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?
答案 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中?