2012-07-13 11 views
7

Nel mio ViewModel ho una collezione di oggetti che contengono ciascuno un'altra collezione. Sto cercando di visualizzarlo nella mia vista usando ListView ItemTemplates nidificati. Ecco una semplificazione del mio codice ViewModel:Come associare dati ListView ItemTemplates nidificati in Metro/WinRT?

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

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

public InnerObject 
{ 
    public string InnerTitle; 
} 

E qui è una semplificazione di come sto cercando di utilizzare questo ViewModel nel mio 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> 

Se rimuovo il ListView interno, il Il binding esterno di ListView funziona perfettamente. Non riesco proprio a capire come associare correttamente l'oggetto della raccolta interna al ListView interno. Ho provato a eseguire la rilegatura interna con {Binding OuterCollection.InnerCollection}, {Binding DataContext.InnerCollection} e {Binding RelativeSource={RelativeSource TemplatedParent}, Path=InnerCollection}, ma tutti questi causano l'arresto anomalo. Qual è il modo corretto per raggiungere questo legame annidato?

EDIT: Dovrei aggiungere che questo è per un'applicazione in fase di porting da Windows Phone 7, ed è un tentativo di trovare un sostituto per LongListSelector, che non è disponibile in WinRT.

risposta

8

Ho trovato la soluzione! Richiedeva una combinazione delle mie soluzioni precedentemente tentate. La correttezza vincolante per la raccolta interna in una lista annidata è:

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

Inoltre, a seconda del vostro scopo per i ListViews nidificati, l'ho trovato meglio utilizzare un ItemsView per la raccolta esterna e un controllo ListView per la raccolta interna . Altrimenti, la selettività dei due controlli si sovrappongono.

+0

Questo ha funzionato per me! Sono impazzito cercando di capirlo. Un problema: hai dovuto cambiare {Binding InnerTitle} con qualcos'altro? Sto vedendo tutti i miei elementi ListView creati correttamente, ma {Binding InnerTitle} non funziona. – Weston

+0

Nevermind - il mio problema era che non mi ero reso conto che 'nome stringa pubblico;' non vincola, mentre 'stringa pubblica Nome {get; impostato; } fa. – Weston

Problemi correlati