是否有某种方法可以使的DataContext
在其资源中的绑定中使用?从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>
上述模板被用作ListBox
的CellTemplate
。该级别的对象有两个属性,History
(包含“历史信息”对象列表)和Model
(包含一堆其他内容,包括Type
)。我正在使用ItemsControl
来显示彼此相邻的历史项目;我想为每个图像显示一张图像,图像是从BitmapProvider
获得的,这是一个IValueConverter
。
转换器需要两位信息来获得结果:一个是各个历史项目的Data
,另一个是整个集合的Type
。另外一个复杂的情况是,构建这个特定的转换器(或者改变给它的Type
)是昂贵的,所以我不想把它放在个别历史项目的层面上,或者使用MultiBinding
,而且我不能将它放在模板之外,因为那样它将无法访问Type
。
不幸的是,上面给了我以下错误:
System.Windows.Data错误:2:无法找到目标元素理事FrameworkElement的或FrameworkContentElement上。 BindingExpression:路径= Model.Type;的DataItem = NULL;目标元素是'BitmapProvider'(HashCode = 57142809);目标属性是'Type'(类型'TypeDetails')
我的理解是指资源无法弄清楚如何获取它所包含的元素的DataContext
。 (我已经搜索过了,大部分我能找到的答案都建议将它移动到模板之外或使用MultiBinding
代替 - 在我的例子中,这两种方法都不能真正起作用,但我会很高兴被证明是错误的,或给出另一种选择。)
+1的DataContextSpy,我在这里学到的东西... – David 2011-03-23 08:56:27
这是新的我了。但它的工作。谢谢! (我仍然在考虑一种不同的解决方案:将昂贵的部件提取到由集合的ViewModel托管的单独的类中,并使转换器使用该项目和该项目的Data来获得结果。但我不那么喜欢它,因为它感觉太像使用View-specific数据污染ViewModel - 我喜欢能够在多个Views之间共享一个ViewModel。) – Miral 2011-03-24 04:53:43
不要担心这是一种破解!如果你看那篇文章的日期(2008年7月),你会发现它已经存在了一段时间。另一个非常有用的类是[ElementSpy](http://joshsmithonwpf.wordpress.com/2008/07/22/enable-elementname-bindings-with-elementspy/)。将它保留在有用的WPF帮助程序列表中! – 2011-03-24 08:45:00