Chciałbym dynamicznie, w zależności od ilości elementów w kolekcji która bedzie bindowana z ViewModelu dodać kontrolki na widok.
W ViewModel mam:
ObservableCollection<Element> gdzie Element to klasa posiadająca właściwosci Nazwa, Ilość, Cena
Teraz w zależności od ilości elementów w tym ObserwableCollection chciałbym wrzucic na widok kontrolki tak zebym mógł tą klekcję pokazac w widoku, tak że obiekty typu Element w osobnej lini, z możliwością scrollowania okna. Chciałbym uzyskać taki widok. Czy mogłby ktoś pomóc?
Zacznij od użycia ItemsControl
, któremu poprzez Binding
podepniesz źródło (ItemsSource
).
Źródłem możesz już potem dowolnie zarządzać dodając lub usuwając elementy.
Ważne:
Najlepiej by kolekcja jaką pod to podepniesz była ObservableCollection
, natomiast binding ustaw na TwoWay
.
Przykłady kodu możesz znaleźć w:
- dokumentacji
- SO - pierwsza odpowiedź, chociaż nie zaakceptowana, to według mnie najlepsza by zacząć.
- MSDN forum - aczkolwiek tutaj dużo odpowiedzi bazuje na podejściu code behind, którego rzecz jasna nie polecam.
Aczkolwiek zastanawiam się, czy w ogóle tędy droga. Robiłem ostatnio u siebie coś podobnego:
W bazie trzymam listę itemów (książek), które wyświetlane są na liście (ListView
). Lista jest w pełni dynamiczna i można ją dowolnie ostylować.
Cały widok takiej listy wygląda tak:
<ListView Margin="10" Grid.Column="0" Grid.Row="0"
Background="Transparent"
Foreground="Wheat"
ItemsSource="{Binding BooksList}"
ItemTemplate="{StaticResource BooksListViewTemplate}"
SelectionMode="Single"
MinHeight="100"
VerticalAlignment="Stretch"
BorderThickness="1"
SelectedIndex="{Binding SelectedBookIndex}"
/>
a kluczowym punktem jest tutaj ItemTemplate
, który decyduje o tym, jak wygląda każdy element na liście.
Czyli tam, gdzie ja mam jedynie napis, Ty możesz mieć przyciski i cokolwiek sobie zaprojektowałeś.
Podrzucam też listę pull requestów, które to implementują.