Edit:
J'ai trouvé une méthode pour le faire, mais je ne suis pas sûr que ce soit la meilleure façon.
Dans l'initialisation WindsorContainer
, d'abord j'enregistrer viewmodel:WPF + Château de Windsor + MVVM: Locator-DataContext
container.Register(Component.For<CentrosViewModel>().LifeStyle.Transient);
et plus tard, j'enregistrer la vue
container.Register(Component.For<CentrosAdminView>().LifeStyle.Transient.DependsOn(Property.ForKey("DataContext")
.Eq(ViewModelLocator.Centrosviewmodel)));
et la définition de la propriété ViewModelLocator.Centrosviewmodel
est:
public static CentrosModel Centrosviewmodel
{
get
{
return App.container.Resolve<CentrosViewModel>();
}
}
Fin Modifier
J'essaie de faire une application Wpf en utilisant Castle Windsor et Mvvm Toolkit (galasoft) mais je pense que mon problème sera le même avec n'importe quelle boîte à outils MVVM. Avec MVVM, vous devez définir le DataContext de la vue sur votre ViewModel. Normalement, cela se fait par quelque chose comme cela dans la déclaration de la vue
DataContext={Binding MyViewModelInstanceName,Source={StaticResource Locator}}
Resource Locator est défini dans App.xaml comme ceci:
<Application.Resources>
<!--Global View Model Locator-->
<vm:ViewModelLocator x:Key="Locator" />
</Application.Resources>
Si je StartupUri dans App.xaml établirai à mon avis tout est correct. Mais si je laisse StartupUri vide et je tente d'obtenir une instance de mon point de vue à travers le château en utilisant la syntaxe suivante:
container.Resolve<CentrosAdminView>().Show();
Je me exception: "Cannot Find Resource with Name '{Locator}'
Je supose que initial DataContext est différent lors de l'exécution directe que lors de la traversée de Castle Windsor et c'est la raison pour laquelle il ne peut pas trouver de ressources.
Mes deux questions sont:
- Est-il nécessaire avoir un ViewModelLocator lors de l'utilisation du château de Windsor? Dans
- cas de Oui: Comment puis-je configurer correctement DataContext de vues avec
- Windsor? Dans le cas de Non: Comment serait la bonne façon?
Je laisse ma configuration de château. Toute aide sera grandement appréciée.
Mon apparence de configuration Windsor comme ceci:
<castle>
<properties>
<!-- SQL Server settings -->
<connectionString>Server=192.168.69.69;Database=GIOFACTMVVM;user id=sa;password=22336655</connectionString>
<nhibernateDriver>NHibernate.Driver.SqlClientDriver</nhibernateDriver>
<nhibernateDialect>NHibernate.Dialect.MsSql2005Dialect</nhibernateDialect>
</properties>
<facilities>
<facility id="nhibernatefacility"
type="Repository.Infrastructure.ContextualNHibernateFacility, Repository">
<factory id="sessionFactory1">
<settings>
<item key="connection.provider">NHibernate.Connection.DriverConnectionProvider</item>
<item key="connection.driver_class">#{nhibernateDriver}</item>
<item key="connection.connection_string">#{connectionString}</item>
<item key="dialect">#{nhibernateDialect}</item>
<item key="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</item>
</settings>
<assemblies>
<assembly>Domain</assembly>
<assembly>ObservableCollections</assembly>
</assemblies>
</factory>
</facility>
</facilities>
</castle>
et par code:
public static IWindsorContainer Start()
{
var container = new WindsorContainer(new XmlInterpreter());
container.AddFacility<TransactionFacility>();
container.Register(
Component.For<HistoriasAdminView>().LifeStyle.Transient,
Component.For<HistoriasModel>().LifeStyle.Transient,
Component.For<CentrosModel>().LifeStyle.Transient,
Component.For<CentrosAdminView>().LifeStyle.Transient,
Component.For<MainViewModel>().LifeStyle.Transient,
Component.For<MainWindow>().LifeStyle.Transient,
Component.For<IRepository<Historias>>().ImplementedBy<Repository<Historias>>().LifeStyle.Transient,
Component.For<IRepository<Centros>>().ImplementedBy<Repository<Centros>>().LifeStyle.Transient,
Component.For<IUnitOfWork>().ImplementedBy<NHUnitOfWork>().LifeStyle.Transient
);
return container;
}
Dans votre cas spécifique, vous pouvez prendre des références à vos composants 'Model' en tant que paramètres constructeurs ou propriétés sur chaque' ViewModel'. Alors vous n'avez pas besoin de cette classe de localisateur. –
bien, avez-vous le temps de l'écrire dans codeproject? :) – ktutnik
Vous ne pouvez pas démarrer le nom de vos méthodes d'usine avec "Get". Voir https://groups.google.com/forum/#!topic/castle-project-users/nA_iF-6NqtY – reggaeguitar