2012-07-13 49 views
7

在我的ViewModel中,我有一个对象的集合,每个对象都包含另一个集合。我试图通过使用嵌套的ListView ItemTemplates在我的视图中显示。这里是我的视图模型代码的简化:如何在Metro/WinRT中绑定嵌套ListView ItemTemplates的数据?

public ViewModelObject 
{ 
    public ObservableCollection<OuterObject> OuterCollection { get; } 
} 

public OuterObject 
{ 
    public string OuterTitle; 
    public ObservableCollection<InnerObject> InnerCollection { get; } 
} 

public InnerObject 
{ 
    public string InnerTitle; 
} 

而这就是我如何尝试使用此视图模型在我的XAML简化:

<ListView ItemsSource="{Binding OuterCollection}"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding OuterTitle}"/> 
       <ListView ItemsSource="{Binding InnerCollection}"> 
        <ListView.ItemTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding InnerTitle}"/> 
         </DataTemplate> 
        </ListView.ItemTemplate> 
       </ListView> 
      </StackPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

如果我删除了内部的ListView中,外部ListView绑定工作得很好。我只是不知道如何正确地将内部集合对象绑定到内部ListView。我尝试了与{Binding OuterCollection.InnerCollection}{Binding DataContext.InnerCollection}{Binding RelativeSource={RelativeSource TemplatedParent}, Path=InnerCollection}进行内部绑定,但所有这些都会导致它崩溃。什么是实现这种嵌套绑定的正确方法?

编辑:我要补充,这是从Windows Phone 7的被移植的应用程序,它是找到LongListSelector的替代者,这是不提供的WinRT的尝试。

回答

8

我想出了解决方案!它需要我以前尝试的解决方案的组合。正确的嵌套的ListView的内部集合绑定是:

{Binding RelativeSource={RelativeSource TemplatedParent}, 
         Path=DataContext.InnerCollection} 

另外,根据你的宗旨,为嵌套列表视图,我发现它更好地使用外部收集的ItemsView和一个ListView为内收集。否则,两个控件的可选性会相互重叠。

+0

这对我有用!我疯了试图弄清楚。有一个问题 - 您是否必须将{Binding InnerTitle}更改为其他内容?我看到所有我的ListView元素都正确创建,但{Binding InnerTitle}不起作用。 – Weston 2012-08-19 03:56:51

+0

没关系 - 我的问题是,我没有意识到'公共字符串名称'''不绑定,而'公共字符串名称{获取;组; ''确实。 – Weston 2012-08-19 16:11:36