Accéder à l'unité de conteneur en vue de la classe du modèle
J'ai une coque qui ressemble à de la barre d'outils et qui définit ma région principale (une enveloppe). Ce dont j'ai besoin pour faire est d'être en mesure d'ajouter des widgets à la coquille et lorsqu'un widget est cliqué, une nouvelle fenêtre (vue) est ouvert. Voici ce que j'ai à ce jour:
J'ai créé un module de classe qui ajoute une vue de la principale région:
public class MyModule : IModule
{
protected IUnityContainer Container { get; private set; }
public MyModule(IUnityContainer container)
{
Container = container.CreateChildContainer();
}
public void Initialize()
{
var regionManager = Container.Resolve<IRegionManager>();
MyModuleView myModuleView = new MyModuleView();
regionManager.Regions["MainRegion"].Add(myModuleView);
}
}
Voici le contenu de MyModuleView:
<Grid>
<Grid.DataContext>
<vm:MyModuleVM/>
</Grid.DataContext>
<Button Content="My Module" Foreground="White" FontWeight="Bold" Command="{Binding Path=LaunchCommand}">
</Button>
</Grid>
Le modèle de vue, MyModuleVM:
class MyModuleVM : ObservableObject
{
protected IUnityContainer Container { get; private set; }
public MyModuleVM()
{
}
RelayCommand _launchCommand;
public ICommand LaunchCommand
{
get
{
if (_launchCommand == null)
{
_launchCommand = new RelayCommand(() => this.LaunchTestView(),
() => this.CanLaunchTestView());
}
return _launchCommand;
}
}
private void LaunchTestView()
{
TestView view = new TestView();
view.Title = "Test View";
var regionManager = Container.Resolve<IRegionManager>();
regionManager.Regions["MyWindowRegion"].Add(view);
}
private bool CanLaunchTestView()
{
return true;
}
}
Donc mon plan était le suivant:
- Créer la classe qui implémente
IModule (MyModule) et de charger une
affichage (MyModuleView) dans l'interpréteur de commandes
lorsque l'initialisation est - Créer un modèle d'affichage pour le module
(MyModuleVM) et la définir comme la
DataContext de la vue affichée dans
la coquille - MyModuleVM contient une commande d'un
bouton MyModuleView lie.
Lorsque le bouton est cliqué sur le
la commande est déclenchée - Maintenant, c'est là que je suis bloqué. À l'aide de
un WindowRegionAdapter (un adaptateur
qui permet de créer des vues en
séparée de windows) j'ai voulu créer
et l'affichage d'un nouveau point de vue. Comme on le voit dans
MyModuleVM, LaunchTestView besoins
l'accès au conteneur afin de
ajouter la vue à une région. Comment suis-je
censé être le contenant?
En plus de ma question spécifique sur l'accès au conteneur, quelle est ma stratégie globale de l'ajout de "widgets" à une barre d'outils shell et le lancement de
points de vue quand on clique dessus? Suis-je comlpetely hors piste ici, quand il s'agit de MVVM avec Prism?
Merci les gars.
OriginalL'auteur Flack | 2010-09-23
Vous devez vous connecter pour publier un commentaire.
Vous pouvez obtenir le conteneur injecté par constructeur ou propriété d'injection. Pour ce faire, le ViewModel instance doit être résolu par le conteneur, ou le L'accumulation de méthode doit être appelée après qu'il a été instancié.
J'espère que cette aide.
Grâce,
Damian
Dans ce cas, vous pouvez le faire après la nouvelle MyModuleView() (c'est à dire: le conteneur.L'accumulation(typeof(MyModuleVM), myModuleView.DataContext);), mais dans ce type de scénario, la résolution de teh RegionManager à travers le ServiceLocator pourrait également être une bonne approche.
Hmm. Il ressemble à myModuleView.DataContext n'a pas encore été créé si j'ajoute l'Accumulation de droit après MyModuleView myModuleView = new MyModuleView(). Je vais peut-être à propos de ce mal. Cela semble être une tâche simple que je fais plus difficile qu'il doit être. Mon approche pour mettre en place une barre d'outils avec des affichages de widget que le lancement d'autres points de vue sonore? Connaissez-vous des bonnes ressources discuter le ServiceLocator?
Quelques ressources: commonservicelocator.codeplex.com, le Prisme de la documentation et le code, Prisme forum questions sur codeplex. L'approche commune pour "modulaire barres d'outils" est similaire à celui que vous êtes suivantes: 1) module de Charge. 2) Résoudre V-VM paire. 3) Ajouter V à la barre d'outils de la région. Vous semblez avoir des problèmes avec les 2), donc je vous conseille de prendre un coup d'oeil sur le Prisme docs et le code, ainsi que l'Unité docs pour comprendre les différentes façons de le V-VM peuvent être connectés ensemble.
Merci pour l'aide Damian.
OriginalL'auteur Damian Schenkelman