2010-07-12 10 views
1

J'ai une vue parent qui est liée à xaml à un ViewModel (le viewmodel est déclaré dans le xaml).Comment puis-je partager un ViewModel entre les vues parent/enfant (Silverlight 3.0)?

Cette vue parente peut alors afficher une vue enfant (via NavigationService, ou navigation: Frame).

La vue parente ne sort jamais de la portée, mais je souhaite que la nouvelle vue enfant partage le ViewModel du parent.

Comment puis-je faire cela? Parce qu'en déclarant le même viewmodel dans le xaml de l'enfant child, la vue enfant obtient sa propre instance viewmodel (c'est-à-dire que ce n'est pas la même instance de viewmodel que sa vue parent).

Merci!

Répondre

2

Cela semble être une opportunité parfaite pour (a) utiliser MEF. Exportez le modèle de vue, puis importez-le dans les vues parent et enfant. Par défaut, ils partageront le même objet. (B) créer une classe de localisation qui garde la trace des instances de modèle de vue, exposée via une propriété statique, et utiliser cette propriété statique pour récupérer le modèle de vue dans le parent et l'enfant:

public static class Locator 
{ 
    private static readonly MyViewModel _instance = new MyViewModel(); 

    public static MyViewModel Instance 
    { 
     get { return _instance; } 
    } 
} 

public partial class MyView 
{ 
    public MyView() 
    { 
     InitializeComponent(); 
     LayoutRoot.DataContext = Locator.Instance; 
    } 
} 
1

Eh bien jusqu'à ce que quelqu'un me donne une bonne réponse, je vais utiliser la solution suivante (si cela fonctionne comme je l'ai jamais testé vraiment encore).

Ma solution hack:

Le ViewModel aura une référence statique public lui-même. Ensuite, la vue enfant (s) va définir son DataContext à la référence statique du ViewModel.

Cheers.

+0

confirmé que cela fonctionne comme une solution possible. – AlvinfromDiaspar

0

La vue enfant hérite de son DataContext de sa vue parente, il n'est pas nécessaire de la déclarer ou de l'assigner une seconde fois.

+0

Désolé, ce n'est pas un véritable enfant de ses parents. Je devrais dire qu'il s'agit d'une sous-vue (c'est-à-dire une vue créée/possédée par sa vue parente). Il n'y a pas d'héritage ici. – AlvinfromDiaspar