0

我正在使用 Silverlight 4。

我为 DataGrid 定义了一个 DataTemplate,它允许我成功地显示我喜欢的值。我在这个 DataTemplate 中有一个 Rating 控件,它在 Value 属性上有一个 Converter,就像这样..

<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?

4

2 回答 2

0

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

于 2012-06-01T17:07:28.187 回答
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 中?

于 2012-06-01T18:03:00.237 回答