2009-09-25 15 views
5

tengo una vista de contenedor que se ve algo como estoDataTemplate impulsada Ver inyección 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> 

Todos mis ViewModels heredan BaseViewModel así que se volvió mi punto de vista en esta

<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 que iba a crear una instancia solo una sola MyView y simplemente vuelva a enlazar el modelo de vista cuando cambie ListBox.SelectedItem. ¿Estoy entendiendo este comportamiento correctamente? ¿Es esta una práctica preferida? ¿Cómo puedo verificar que no estoy agitando la memoria cuando cambio de vista?

Respuesta

1

Instalará un nuevo MyView para cada modelo de vista que utilice. Si desea reutilizar sus controles de usuario, puede establecer la propiedad DataContext en cada control de usuario.

2

Para ampliar la respuesta de Pavel y aclarar lo que sucede cuando a las vistas al cambiar de imagen-modelos es que una nueva vista se generará para la nueva vista-modelo y la vista edad, se esperemos recolección de datos innecesarios en el tiempo .

El problema con esto es que a veces tendremos vistas que se registren a algún evento en el código subyacente (eventos no débiles) y esto evitará que la vista se recopile y tendrá pérdidas de memoria.

Dos enfoques.

  1. cualquier suscripción evento en la vista de código subyacente debe ser debilitan (EventAggregator en PRISM) para permitir la recolección de basura.
  2. Registre una instancia de la vista con el contenedor de unidad y resuélvala cuando necesite reutilizarla. Antes de inyectarlo en la región, simplemente actualice el DataContext.

Espero que esto ayude.