【问题标题】:Binding templated item to Converter's Value property in DataTemplate在 DataTemplate 中将模板项绑定到 Converter 的 Value 属性
【发布时间】:2012-06-01 16:38:42
【问题描述】:

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

【问题讨论】:

    标签: silverlight xaml mvvm silverlight-4.0 datatemplate


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

    我想通了。

    在 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 中是否仍然发生?

    【讨论】:

    • 您没有在 DataGridTemplateColumn 中使用该模板吗?
    • @ErenErsönmez 好点。我的 DataTemplate 实际上存在于 DataGrid.RowDetailsTemplate 中,用于描述我的 DataGrid 的 RowDetails 内容的模板。
    猜你喜欢
    • 2011-10-15
    • 2018-09-30
    • 2013-03-23
    • 2012-04-11
    • 1970-01-01
    • 2013-03-22
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多