是否有某种方法可以让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
代替 - 在这种情况下,这两种情况都不会真正起作用,据我所知,正如我上面所解释的那样。但我很高兴被证明是错误的,或者给出另一种选择。)
答案 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>