是否有某种方法可以获取 DataTemplate
的 DataContext
以在其资源内的绑定(bind)中使用?
<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:Path=模型.类型;数据项=空;目标元素是“BitmapProvider”(HashCode=57142809);目标属性是“Type”(类型“TypeDetails”)
我的理解是,资源无法弄清楚如何获取它所包含的元素的DataContext
。
(我已经搜索过,我能找到的大多数答案都建议将其移到模板之外或使用 MultiBinding
代替——据我所知,在这种情况下,这两种方法都不会真正起作用可以看出,正如我上面所解释的。但我很高兴被证明是错误的,或者给出另一种选择。)
最佳答案
我认为你可以通过 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>
关于wpf - 从 DataTemplate 内的资源绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5401932/