如何在WPF中正确绑定ListBoxItem?

时间:2009-02-03 09:35:30

标签: wpf data-binding xaml listview

我有一个列表框,我想在我的Foo对象中迭代一组Bars。

<ListBox DataContext="{Binding Path=Foo.Bars}" >
    <ListBox.Items>
        <ListBoxItem>
            <ContentControl DataContext="{Binding Path=.}" />
        </ListBoxItem>
    </ListBox.Items>
</ListBox>

这是我想要使用的数据模板。

<DataTemplate DataType="{x:Type Bar}">
        <Label Content="hello stackoverflow" />
</DataTemplate>

如果我窥探( - >使用工具Snoop检查)我的应用程序,我注意到Bars的整个集合绑定到ContentControl,而不仅仅是1

如何正确绑定,以便对集合的迭代正常?

2 个答案:

答案 0 :(得分:8)

您可以设置DataTemplate,WPF可以完成所有工作。将ItemsSource设置为Bar项列表,然后为Bar项定义DataTemplate。

<ListBox ItemsSource="{Binding Path=Foo.Bars}">
    <ListBox.Resources>
        <DataTemplate DataType="{x:Type Bar}">
            <Label Content="hello stackoverflow" />
        </DataTemplate>
    </ListBox.Resources>
</ListBox>

您还可以使用<ListBox.ItemTemplate>代替<ListBox.Resources>

直接设置ItemsTemplate

请参阅MSDN上的Data Binding Overview

答案 1 :(得分:3)

首先将您的命名空间添加到Window元素(Intellisense):

xmlns:local="clr-namespace:yourenamespace"

然后,以下XAML(在Window.Resources中是一种干净的方式):

   <Window.Resources>

        <ObjectDataProvider x:Key="DataProvider" ObjectType="{x:Type local:Foo}"/>

        <DataTemplate x:Key="Template" >
           <TextBlock Text="{Binding Bar}"/>
        </DataTemplate>

    </Window.Resources>

放置Listbox

<ListBox DataContext="{Binding Source={StaticResource DataProvider}}" ItemsSource="{Binding Bars}" ItemTemplate="DynamicResource Template" />

但是,它取决于你的代码隐藏对象,你必须设置一个构造函数来初始化对象中最好的ObservableCollection<>的公共属性(XAML中有对象实例的一些限制规则)。