2013-07-30 51 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'? –

相关问题