2009-02-03 81 views
10

我有一個列表框,我想遍歷我的Foo對象中的一組酒吧。如何正確綁定WPF中的ListBoxItem?

<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> 

如果我探聽( - >使用工具史努比檢查)我的申請,我注意到整個集合酒吧綁定到ContentControl中,在短短1代替。

我該如何正確綁定,以便對集合的迭代進行得很好?

回答

3

首先你的命名空間添加到Window元素(智能感知):

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

但是,它d在你的代碼隱藏對象中,你必須設置一個構造函數來初始化你的對象中的公共屬性,最好是ObservableCollection<>(對於XAML,對象實例有一些限制規則)。

+0

我實現了這一點,它不起作用。 – Natrium 2009-02-03 10:28:52

+1

我建議你在你的問題中輸入你的目標代碼。在我的答案中有一些語法錯誤,我糾正它(資源,不Resouce,忘記GridView,我用手輸入所有內容...)。 – belaz 2009-02-03 10:41:34

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>

Data Binding Overview在MSDN設置ItemsTemplate。