2012-07-13 10 views
7

W moim ViewModelu mam kolekcję obiektów, z których każda zawiera inną kolekcję. Próbuję wyświetlić to w moim widoku przy użyciu zagnieżdżonych ListView ItemTemplates. Tutaj jest uproszczenie mojego kodu ViewModel:Jak powiązać dane zagnieżdżonych ListView ItemTemplates w Metro/WinRT?

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

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

public InnerObject 
{ 
    public string InnerTitle; 
} 

I tu jest uproszczenie sposobu Próbuję użyć tego ViewModel w moim 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> 

Jeśli usunąć wewnętrzną ListView, zewnętrzne powiązanie ListView działa doskonale. Po prostu nie mogę dowiedzieć się, jak poprawnie powiązać wewnętrzny obiekt kolekcji z wewnętrznym ListView. Próbowałem wykonać wewnętrzne powiązanie z {Binding OuterCollection.InnerCollection}, {Binding DataContext.InnerCollection} i {Binding RelativeSource={RelativeSource TemplatedParent}, Path=InnerCollection}, ale wszystkie z nich powodują awarię. Jaki jest właściwy sposób osiągnięcia tego zagnieżdżonego powiązania?

EDIT: należy dodać, że jest to dla aplikacji przenoszony z Windows Phone 7 i jest próbą znalezienia zastępstwa dla LongListSelector, który nie jest dostępny w WinRT.

Odpowiedz

8

Wymyśliłem rozwiązanie! Wymagało to połączenia moich wcześniej podjętych prób. Prawidłowe wiązanie do zbierania wewnętrznego w zagnieżdżonych ListView jest:

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

Ponadto, w zależności od celu dla zagnieżdżonych ListViews, znalazłem to lepiej użyć ItemsView zbierania zewnętrznej i ListView do zbierania wewnętrznej . W przeciwnym razie wybieralność dwóch kontroli nakłada się na siebie.

+0

To zadziałało dla mnie! Szaleję, próbując to rozgryźć. Jedna kwestia - czy musiałaś zmienić {Binding InnerTitle} na coś innego? Widzę, że wszystkie moje elementy ListView zostały poprawnie utworzone, ale {Binding InnerTitle} nie działa. – Weston

+0

Nevermind - moim problemem było to, że nie zdawałem sobie sprawy z "public string Name;" nie wiąże, a 'public string Name {get; zestaw; } 'robi. – Weston

Powiązane problemy