使用ItemsSource和ItemTemplate的WPF列表框

本文关键字:WPF 列表 ItemTemplate ItemsSource 使用 | 更新日期: 2023-09-27 18:10:11

当我在WPF ListBox中同时拥有ItemsSourceItemTemplate时,我很困惑如何解决绑定。

我有一个ObservableCollection<int>称为ListOfIndexes。对于每个索引,我想在数据库表中查找它的记录。我希望在IndexToObjectDescriptionConverter中这样做。

<ListBox ItemsSource="{Binding ListOfIndexes}" 
         ItemTemplate="{Binding Converter={StaticResource IndexToObjectDescriptionConverter}}" />

但是转换器中的一个断点告诉我,ItemTemplate绑定所读入的值是窗口本身的—即ItemsSourceItemsTemplateDataContext是相同的。

恕我直言,但这似乎很愚蠢。ItemTemplate的整个要点是在ItemsSource中呈现每个元素,所以我想我认为ItemTemplateDataContext将是被呈现的单个元素。

那么,我如何告诉ItemTemplate,它应该担心由ItemsSource表示的单个元素,而不是使用整个窗口的DataContext呢?

使用ItemsSource和ItemTemplate的WPF列表框

您需要为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}" />

就是这样。