使用ItemsSource和ItemTemplate的WPF列表框
本文关键字:WPF 列表 ItemTemplate ItemsSource 使用 | 更新日期: 2023-09-27 18:10:11
当我在WPF ListBox
中同时拥有ItemsSource
和ItemTemplate
时,我很困惑如何解决绑定。
我有一个ObservableCollection<int>
称为ListOfIndexes
。对于每个索引,我想在数据库表中查找它的记录。我希望在IndexToObjectDescriptionConverter
中这样做。
<ListBox ItemsSource="{Binding ListOfIndexes}"
ItemTemplate="{Binding Converter={StaticResource IndexToObjectDescriptionConverter}}" />
但是转换器中的一个断点告诉我,ItemTemplate
绑定所读入的值是窗口本身的—即ItemsSource
和ItemsTemplate
的DataContext
是相同的。
恕我直言,但这似乎很愚蠢。ItemTemplate
的整个要点是在ItemsSource
中呈现每个元素,所以我想我认为ItemTemplate
的DataContext
将是被呈现的单个元素。
ItemTemplate
,它应该担心由ItemsSource
表示的单个元素,而不是使用整个窗口的DataContext
呢?
您需要为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将为每个项目呈现,并将该项目作为其数据上下文
首先,我建议你好好阅读一下MSDN中的数据模板概述页面,这样你就可以更好地理解这个数据绑定过程。
我想在数据库表中查找它的记录。我希望在IndexToObjectDescriptionConverter中做到这一点。
这是你的第一个错误。IValueConverter
负责转换数据绑定值,而不是访问数据库。访问视图模型中的数据,并用结果填充公共属性。然后将这些属性绑定到XAML中的UI控件。
恕我直言,但这似乎很愚蠢
只对那些不了解情况的人。
我如何告诉ItemTemplate它应该担心由ItemsSource表示的单个元素,而不是使用整个窗口的DataContext?
你什么都不要告诉它…只要定义正确的XAML就足够了:
In Resources
:
<DataTemplate x:Key="SomeDataTemplate">
<!-- The DataContext here is set to an item from the data bound collection -->
</DataTemplate>
在XAML: <ListBox ItemsSource="{Binding ListOfIndexes}"
ItemTemplate="{StaticResource SomeDataTemplate}" />
就是这样。