Desidero riutilizzare i miei UserControls in altri UserControls come pagina o finestra come DataTemplates, in questo esempio all'interno di un ListBox. Tutto è MVVM.UserControl come DataTemplate all'interno di ListBox
Ho un controllo utente denominato "CardControl" per visualizzare un oggetto semplice "Scheda". La carta ha due proprietà, "ID" e "CardImage". I controlli DataContext sono impostati tramite XAML. Se apro questo UserControl in VS o Blend, mi mostra la dummy Card che ho definito nel corrispondente ViewModel.
Ora ho un altro UserControl chiamato "CardSetControl", che dovrebbe visualizzare una raccolta di schede. Quindi ViewModel ha una proprietà di tipo ObservableCollection <Card> chiamata "Carte".
Ecco il codice:
<ListBox x:Name="MyList" ItemsSource="{Binding CardSet.Cards}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<!-- WORKING, but not what i want -->
<TextBlock Text="{Binding ID}" /> // would display ID of Card
<Image Source="{Binding Image}" /> // would display Image of Card
<!-- NOT WORKING, but this is how i want it to work -->
<UserControls:CardControl DataContext="{Binding "Current listbox item as DataContext of CardControl???"}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Dopo aver letto tonnellate di articoli su MVVM e DataContext/Binding non ho ancora farlo funzionare. In che modo tutta questa cosa gerarchica USerControls/DataContexts ha fatto il modo migliore e pulito?
Will, le mie scuse ho praticamente dato la stessa risposta esatta come te.Dovrei aggiornare la pagina prima di rispondere la prossima volta;) –
In questo modo un modello (Card) viene passato come DataContext al controllo utente. Cosa succede se mi piacerebbe che quel controllo utente utilizzasse il suo modello di visualizzazione? Come devo passare questo modello ricevuto a un modello di vista e associare il modello di vista alla vista del controllo? –
@OndrejJanacek: UserControls non deve essere progettato per avere i propri modelli di visualizzazione. Dovrebbero avere proprietà pubbliche associabili sulla loro superficie che gli utenti si legheranno ai propri modelli di vista. Questa risposta è più adatta all'OP che alle migliori pratiche:/ – Will