2011-03-23 83 views
2

是否有某种方法可以使的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> 

上述模板被用作ListBoxCellTemplate。该级别的对象有两个属性,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代替 - 在我的例子中,这两种方法都不能真正起作用,但我会很高兴被证明是错误的,或给出另一种选择。)

回答

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> 
+0

+1的DataContextSpy,我在这里学到的东西... – David 2011-03-23 08:56:27

+0

这是新的我了。但它的工作。谢谢! (我仍然在考虑一种不同的解决方案:将昂贵的部件提取到由集合的ViewModel托管的单独的类中,并使转换器使用该项目和该项目的Data来获得结果。但我不那么喜欢它,因为它感觉太像使用View-specific数据污染ViewModel - 我喜欢能够在多个Views之间共享一个ViewModel。) – Miral 2011-03-24 04:53:43

+0

不要担心这是一种破解!如果你看那篇文章的日期(2008年7月),你会发现它已经存在了一段时间。另一个非常有用的类是[ElementSpy](http://joshsmithonwpf.wordpress.com/2008/07/22/enable-elementname-bindings-with-elementspy/)。将它保留在有用的WPF帮助程序列表中! – 2011-03-24 08:45:00