2013-07-30 91 views
0

我正在使用WPF 4.0和Caliburn Micro在C#中開發應用程序。我需要綁定一個ViewModel到一個DataTemplate中的控件之一的列表框。這個DataTemplate在外部列表框中用作ItemTemplate,並且...不,我想這不是很清楚。WFP將ViewModel綁定到另一個列表框中的列表框,這兩個列表框都使用DataTemplates

讓我試着解釋一下我需要做的一個例子,帶有幾間房間的酒店,每間房間有幾個客人。

酒店屏幕上有一個名爲Rooms的列表框,該列表框綁定到一個名爲Rooms的房間,其中包含RoomViewModel項目。該房間列表已命名RoomTemplate,看起來像這樣一個ItemTemplate:

<ListBox x:Name="Rooms" ItemTemplate="{DynamicResource RoomTemplate}"/> 

隨着RoomTemplate看起來像這樣(高度簡化):

<DataTemplate x:Key="RoomTemplate"> 
    <DockPanel VerticalAlignment="Top"> 
     <TextBlock x:Name="RoomDescription" Text="{Binding Path=RoomDescr}" /> 
     <ListBox x:Name="Guests" ItemTemplate="{DynamicResource GuestTemplate}"/> 
    </DockPanel> 
</DataTemplate> 

RoomViewModel包含含有GuestViewModel項目一個ObservableCollection命名的客人。 RoomTemplate包含一個名爲Guests的列表框,它應顯示Guests集合中的GuestViewModel項目。 GuestTemplate將包含多個需要綁定到GuestViewModel的TextBlocks。

第一個綁定到listbox的房間到集合房間由CM的約定活頁夾處理並且工作得很好。我的問題是GuestTemplate中listbox Guests的第二個綁定。我如何將它綁定到Rooms集合中包含的RoomViewModels中的Guest項目?

+0

好的,我已經解決了。解決方案是ItemsSource =「{Binding Guests}」,我已經嘗試過了,但是我的代碼中有另一個錯誤,所以它不起作用。多謝你們! – Liell

回答

0
<ListBox ItemsSource="{Binding Guests}" ItemTemplate="{DynamicResource GuestTemplate}"/> 
+0

將'ItemTemplate'設置爲'DynamicResource',將'RoomTemplates'中的'DataType'應用於'Room'和'Guest'有什麼區別? –

+0

@Bob。不同之處在於,如果設置了ItemTemplate,那麼給定的ListBox或ItemsControl中的所有項都將具有相同的Template,而使用DataTemplate.DataType則讓WPF負責爲每個項目找到合適的模板,因此允許在同一個ListBox/ItemsControl中使用不同的模板。 –

+0

是否有情況需要使用其中一種?如果你知道'ListBox'將有'Type A'對象,你是否應該在'ItemTemplate'中指定'Type A Template'而不是'ListBox.Resources'中的'DataTemplate'?然後在'ListBox.Resources'裏面有'Type B Template'並讓WPF自己解析'DataType'? –

相關問題