2012-07-13 65 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