我有一个列表框,我想在我的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
如何正确绑定,以便对集合的迭代正常?
答案 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>
请参阅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
中有对象实例的一些限制规则)。