使用ItemsSource和ItemTemplate的WPF ListBox

时间:2014-06-25 14:40:51

标签: c# wpf binding listbox

当我在WPF ItemsSource中同时拥有ItemTemplateListBox时,我对如何解决绑定感到困惑。

我有ObservableCollection<int>名为ListOfIndexes。对于每个索引,我想在数据库表中查找其记录。我希望在IndexToObjectDescriptionConverter

中这样做
<ListBox ItemsSource="{Binding ListOfIndexes}" 
         ItemTemplate="{Binding Converter={StaticResource IndexToObjectDescriptionConverter}}" />

但是转换器中的断点告诉我ItemTemplate绑定读取的值是窗口本身 - 即DataContext和{{ItemsSource 1}}是一样的。

请原谅一点坦率,但这似乎是DUMB。 ItemsTemplate的整个点是在ItemTemplate内呈现每个元素,所以我想我认为ItemsSource的{​​{1}}将是要呈现的单个元素。

那就是说,如何告诉DataContext它应该担心ItemTemplate所代表的各个元素,而不是使用整个窗口的ItemTemplate

2 个答案:

答案 0 :(得分:6)

您需要为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,并将该项目作为其数据上下文。

答案 1 :(得分:1)

首先,我建议您仔细阅读MSDN中的Data Templating Overview页面,以便更好地了解此数据绑定过程。

  

我想在数据库表中查找其记录。我希望在IndexToObjectDescriptionConverter中执行此操作。

这是你的第一个错误。 IValueConverter负责转换数据绑定值,访问数据库。在视图模型中访问您的数据,并使用结果填充公共属性。然后数据将这些属性绑定到XAML中的UI控件。

  

请原谅一点坦率,但这似乎是DUMB

仅限那些不了解情况的人。

  

如何告诉ItemTemplate它应该担心ItemsSource表示的各个元素而不是使用整个窗口的DataContext?

你什么都不说......只要定义正确的XAML就足够了:

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}" />

那就是它。