从DataTemplate内部的资源绑定

时间:2011-03-23 07:11:32

标签: wpf xaml binding resources datatemplate

是否有某种方法可以让DataContext的{​​{1}}用于其资源中的绑定?

DataTemplate

以上模板用作<DataTemplate x:Key="History"> <ItemsControl ItemsSource="{Binding History}"> <ItemsControl.Resources> <app:BitmapProvider x:Key="Converter" ShowDetails="True" Type="{Binding Model.Type}" /> </ItemsControl.Resources> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal" IsItemsHost="True"/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate> <DataTemplate> <Image Source="{Binding Data, Converter={StaticResource Converter}}" /> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </DataTemplate> 的{​​{1}}。该级别的对象有两个属性CellTemplate(包含“历史信息”对象列表)和ListBox(包含一堆其他内容,包括History)。我正在使用Model来显示彼此相邻的历史项目;我想为每个图像显示图像,图像是从Type获得的,这是一个ItemsControl

转换器需要两位信息才能获得结果:一个是各个历史项的BitmapProvider,另一个是整个集合的IValueConverter。一个额外的复杂性是构造这个特定的转换器(或更改给它的Data)是昂贵的,所以我不想把它放在单个历史项的级别,或使用{{1我无法将其置于模板之外,因为它无法访问Type

不幸的是,上面给出了以下错误:

System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。 BindingExpression:路径= Model.Type;的DataItem = NULL; target元素是'BitmapProvider'(HashCode = 57142809); target属性为'Type'(类型'TypeDetails')

我理解这意味着资源无法弄清楚如何获取其中包含的元素的Type

(我已经搜索过了,我发现的大多数答案都建议将其移到模板之外或使用MultiBinding代替 - 在这种情况下,这两种情况都不会真正起作用,据我所知,正如我上面所解释的那样。但我很高兴被证明是错误的,或者给出另一种选择。)

1 个答案:

答案 0 :(得分:3)

我认为你可以用DataContextSpy来实现这一目标。

尝试类似:

<ItemsControl.Resources>
  <spy:DataContextSpy x:Key="Spy"/>
  <app:BitmapProvider x:Key="Converter" ShowDetails="True"
                      Type="{Binding DataContext.Model.Type,Source={StaticResource Spy}}" />
</ItemsControl.Resources>