2009-10-16 8 views
9

Może brakuje mi czegoś oczywistego, więc przepraszam, jeśli to naprawdę głupie pytanie. Mam WrapPanel w widoku, które muszę powiązać z ObservableCollection na ViewModel. Ta ObservableCollection zawiera inny typ ViewModel, który musi być powiązany z innym typem widoku, gdy jest wyświetlany w WrapPanel. Celem jest stworzenie opakowującej listy elementów, z których każda jest wyświetlana za pomocą przykładu mniejszego widoku, który powinien zostać dodany do WrapPanel.Powiązanie elementów ObservableCollection z UserControl w WrapPanel?

Używam MVVM, a ViewModel nie ma bezpośredniego dostępu do widoku. Wolałbym nie tworzyć powiązania między ViewModel i View, jeśli to w ogóle możliwe, więc ręczne dodawanie elementów do kolekcji WrapPanel.Children nie jest realną opcją. Nie mam pojęcia, w jaki sposób mogę powiązać kolekcję potomnych obiektów ViewModel z WrapPanel w taki sposób, że utworzą one instancje innego widoku i dodadzą je do siebie. Czy po prostu podchodzę do problemu nieprawidłowo? Sądzę, że jest prawdopodobnie zaangażowany DataTemplate, ale nie wydaje się, że WrapPanel ma DataTemplate, ani nie jest to bindable.

Dzięki za wszelki wgląd.

+0

Wydaje mi się, że masz sytuację, w której różne modele wyświetlania znajdują się w tej samej kolekcji. Każda z tych modeli widokowych ma swój własny widok. Po wyświetleniu tych maszyn wirtualnych w kontenerze chcesz, aby każdy widok był zawijany o dodatkowy poziom? (Jak commond border wokół każdego oddzielnego elementu?) –

+0

Kolekcja zawiera wszystkie tego samego typu, w tym przypadku ServiceMonitorViewModel. Muszę wyświetlić je w opakowaniu z możliwością opakowania w widoku rodzica. – jrista

Odpowiedz

19

Co trzeba to ListView, który wykorzystuje WrapPanel gospodarzem wszystkich przedmiotów.

<ListView ItemsSource={...}> 
    <ListView.ItemsPanel> 
    <ItemsPanelTemplate> 
     <WrapPanel IsItemsHost="True" /> 
    </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
     <!-- Fill in how you want each item to look here --> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 
+0

Dzięki za wgląd Andrew. Zrobiłem to i napotkałem inny problem. Mam nadzieję, że możesz w tym pomóc, inaczej zacznę kolejne pytanie. Wrzuciłem , my UserControl, do DataTemplate. Otrzymuję następujący błąd: Nie można utworzyć wystąpienia typu "ServiceMonitorView". Kontrola użytkownika ma zerowy kod poza domyślnym, wygenerowanym konstruktorem ... więc nie powinno być żadnego kodu konstruktora zgłaszającego wyjątek. – jrista

+0

@jrista: Powiedziałbym, że jest to oddzielny problem, który należy do niezależnego pytania. (Nie znam odpowiedzi, ale jestem zainteresowany tym, co by to było) –

14

Zastosowanie ItemsControl i ustawić jego ItemsPanel do WrapPanel:

<ItemsControl ItemsSource="{Binding Something}" ItemTemplate="{StaticResource YourDataTemplate}"> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <WrapPanel /> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 
+0

To jest niesamowite. Świetnie się pracuje w silverlight ... – Anirudha