2009-09-25 10 views
5

ho una visione contenitore che sembra qualcosa di simileDataTemplate-driven Vedi iniezione con MVVM

<UserControl x:Class="Views.ContainerView"> 
    <UserControl.Resources> 
     <ResourceDictionary> 
      <DataTemplate DataType="{x:Type viewmodels:AViewModel}"> 
       <views:MyView /> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type viewmodels:BViewModel}"> 
       <views:MyView /> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type viewmodels:CViewModel}"> 
       <views:MyView /> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type viewmodels:DViewModel}"> 
       <views:MyView /> 
      </DataTemplate> 
     </ResourceDictionary> 
    </UserControl.Resources> 
    <Grid> 
     <ListBox ItemsSource="{Binding Path=AvailableViewModels}" 
      SelectedItem="{Binding Path=CurrentViewModel}" 
      IsSynchronizedWithCurrentItem="True" /> 
     <ContentControl Content="{Binding Path=CurrentViewModel}" /> 
    </Grid> 
</UserControl> 

Tutti i miei ViewModels ereditano BaseViewModel così ho trasformato la mia vista in questo

<UserControl x:Class="Views.ContainerView"> 
    <UserControl.Resources> 
     <ResourceDictionary> 
      <DataTemplate DataType="{x:Type viewmodels:BaseViewModel}"> 
       <views:MyView /> 
      </DataTemplate> 
     </ResourceDictionary> 
    </UserControl.Resources> 
    <StackPanel> 
     <ListBox ItemsSource="{Binding Path=AvailableViewModels}" 
      SelectedItem="{Binding Path=CurrentViewModel}" 
      IsSynchronizedWithCurrentItem="True" /> 
     <ContentControl Content="{Binding Path=CurrentViewModel}" /> 
    </StackPanel> 
</UserControl> 

pensando che sarebbe istanziare solo un singolo MyView e basta ricollegare il viewmodel quando ListBox.SelectedItem cambia. Sto capendo correttamente questo comportamento? È una pratica preferita? Come posso verificare che non sto sfogliando la memoria mentre passo da una vista all'altra?

risposta

1

Istanzerà un nuovo MyView per ogni modello di vista che si utilizza. Se si desidera riutilizzare i controlli utente, è possibile impostare la proprietà DataContext su ciascun controllo utente.

2

Ad ampliare la risposta di Pavel e chiarire che cosa accade quando i punti di vista quando si cambiare immagine modelli è che una nuova vista verrà generato per la nuova vista-modello e la vecchia vista sarà spera essere garbage collection in tempo .

Il problema con questo è a volte avremo visualizzazioni che registrano alcuni eventi nel codice dietro (eventi non deboli) e questo impedirà la raccolta della vista e tu avrà perdite di memoria.

Due approcci.

  1. Qualsiasi sottoscrizione evento in vista code-behind deve essere indebolita (EventAggregator in PRISM) per consentire la garbage collection.
  2. Registrare un'istanza della vista con il contenitore di unità e risolverla quando è necessario riutilizzarla. Prima di iniettarlo nella regione, basta aggiornare DataContext.

Spero che questo aiuti.