当我在WPF ItemsSource
中同时具有ItemTemplate
和ListBox
时,对于如何解析绑定感到困惑。
我有一个名为ObservableCollection<int>
的ListOfIndexes
。对于每个索引,我想在数据库表中查找其记录。我希望在IndexToObjectDescriptionConverter
中这样做。
<ListBox ItemsSource="{Binding ListOfIndexes}"
ItemTemplate="{Binding Converter={StaticResource IndexToObjectDescriptionConverter}}" />
但是转换器中的断点告诉我,
ItemTemplate
绑定所读取的值是窗口本身的值,即DataContext
和ItemsSource
的ItemsTemplate
是相同的。请原谅,虽然这有点愚蠢。
ItemTemplate
的全部要点是渲染ItemsSource
中的每个元素,所以我想我认为DataContext
的ItemTemplate
是要渲染的单个元素。所以,也就是说,我如何告诉
ItemTemplate
应该担心代表的各个元素,而不要使用整个窗口的ItemsSource
? 最佳答案
您需要为ItemTemplate使用数据模板。然后将其应用于列表中的每个项目
MSDN文档在这里:
http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemtemplate(v=vs.110).aspx
她的问题与数据上下文范围有关。当您在ListBox上绑定任何属性时,它将使用ListBox的数据上下文-因此为什么将数据上下文传递给转换器。如果您在ItemTemplate中设置数据模板,它将将该模板应用于列表中的每个项目。我想根据您提供的简单代码,您需要将转换器包含在数据模板中:
<ListBox ItemsSource="{Binding ListOfIndexes}">
<ListBox.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding Converter={StaticResource IndexToObjectDescriptionConverter}}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
在这种情况下,将为每个项目呈现ContentControl,并将该项目作为数据上下文。