2012-04-12 64 views
1

我有一個模型類Person和一個UserControl PersonComboBoxItem來顯示它。組合框中的數據綁定:使用Usercontrol顯示每個項目

我想要做的是創建一個ComboBox,其ItemsSource綁定到我的ObservableCollection<Person>,稱爲People並使用我的PersonUserControl顯示集合中的每個Person。

<Grid> 
    <ComboBox SelectedIndex="0" ItemsSource="{Binding People}" >    
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <local:PersonComboBoxItem Person="{Binding ###how do I get the current item here to set the property 'Person' on my PersonComboBoxItem class? ### }" /> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 
</Grid> 

我已經工作我的方式thorugh這個great article about databinding on msdn,但我不能在得到過渡到我的設計的方法。 隨時批評它 - 我不確定,如果這是WPF的方式來做到這一點。

問候,弗洛裏安

P.S:我的示例代碼可以從here下載。

回答

2

ItemTemplateDataContext是當前Person,直接結合到DataContext從而給Person只是使用{Binding}

您可以設計UserControl直接使用當前DataContext而不是Person屬性,那麼您不需要明確設置任何內容。

+0

完美,非常感謝! – FloWi 2012-04-12 15:45:04

2

只需使用隱式DataTemplate告訴WPF如何繪製Person對象時遇到它在視覺樹

<Grid> 
    <ComboBox SelectedIndex="0" ItemsSource="{Binding People}" DisplayMemberPath="Name">    
     <ComboBox.Resources> 
      <DataTemplate DataType="{x:Type local:Person}"> 
       <local:PersonComboBoxItem /> 
      </DataTemplate> 
     </ComboBox.Resources> 
    </ComboBox> 
</Grid> 

ComboBox已經把你的Person數據對象在VisualTree,並可能看起來是像這樣:

<StackPanel> 
    <ContentPresenter> 
     <Person /> 
    </ContentPresenter> 
    <ContentPresenter> 
     <Person /> 
    </ContentPresenter> 
    <ContentPresenter> 
     <Person /> 
    </ContentPresenter> 
    ... 
</StackPanel> 

所以,你只需簡單地更換它說:<Person /><local:PersonComboBoxItem />。您UserControlDataContext將被設置爲你的Person對象以及

此外,PersonItemComboBoxDataContext永遠是Person類型的,所以你甚至不需要Person依賴屬性。

+0

非常感謝。我發現,我只能接受一個答案作爲我的「接受答案」。 - >先到先得。 ;-) – FloWi 2012-04-12 15:46:11