2010-10-06 8 views
5

Nel nostro prodotto, utilizziamo il primo approccio del modello MVVM e funziona bene, ma con un avvertimento. Quando la visualizzazione diventa complessa, è necessario del tempo per crearla dal modello di dati. Se la vista viene mostrata e nascosta frequentemente, diventa leggermente irritante. Se si utilizza prima la vista, sarebbe abbastanza facile memorizzare una vista in cache se necessario, ma quando si utilizza DataTemplate e il modello per primi, non abbiamo molto controllo sulla creazione della vista. Chiunque ha già risolto questo problema senza passare alla visualizzazione del primo metodo?È possibile memorizzare nella cache la vista quando si utilizza il primo approccio del modello?

risposta

3

con viewmodel primo approccio penso che non si abbia la possibilità di "memorizzare" la vista. quindi potresti considerare di usare view view e viewmodel locator per i flussi di lavoro dei datatemplates pesanti. here è una soluzione quando si utilizzano datatemplates con elenchi.

ma forse c'è qualche soluzione con l'override del meccanismo datatemplate wpf?

modifica: cosa succede se si crea solo un "markerview" per il tuo viewmodel, quindi wpf datatemplate può trovarlo. e quindi all'interno di questa vista marker crei/reidratri la vista reale? qualcosa come un localizzatore di servizi di visualizzazione?

+0

Neat idea sul "markerview", vedrò se funziona ... –

+0

fammi sapere se funziona;) – blindmeis

5

Funziona perfettamente se si utilizza l'idea @blindmeis.

La ricetta complessiva:

Creare un ContentControl o UserControl denominato ViewCache:

public partial class ViewCache 
{ 
    public ViewCache() 
    { 
     InitializeComponent(); 
     Unloaded += ViewCache_Unloaded; 
    } 

    void ViewCache_Unloaded(object sender, RoutedEventArgs e) 
    { 
     Content = null; 
    } 

    private Type _contentType; 
    public Type ContentType 
    { 
     get { return _contentType; } 
     set 
     { 
      _contentType = value; 
      Content = ViewFactory.View(value); // use you favorite factory 
     } 
    } 
} 

Nel DataTemplate, utilizzare il ViewCache, passare il tipo di visualizzazione vera e propria che si desidera utilizzare:

<Window.Resources> 
    <DataTemplate DataType="{x:Type TestViewCache:Foo}"> 
     <TestViewCache:ViewCache ContentType="{x:Type TestViewCache:View }"/> 
    </DataTemplate> 
</Window.Resources> 
<StackPanel> 
    <ContentPresenter Height="200" Width="300" 
     Content="{Binding ViewModel}"/> 
    <Button Content="Set VM" Click="SetVMClick"/> 
    <Button Content="UnSet VM" Click="UnSetVMClick"/>   
</StackPanel> 
+0

Grazie ma sarà meglio scrivere var control = visualizza come controllo; control.DataContext = DataContext; Content = view; –

+0

Ehi, Sergey, stavo cercando una soluzione per la cache della vista e ho trovato la tua implementazione. Non capisco come accedere al modello di visualizzazione dal genitore viewmodel quindi. Devo accedere anche al 'ViewCache'? E come viene implementato il cambiamento della vista nel modello di visualizzazione principale? – derape

Problemi correlati