Изменить:
Я нашел один способ сделать это, но не уверен, что он лучший.
При инициализации WindsorContainer
сначала я регистрирую модель просмотра:
container.Register(Component.For<CentrosViewModel>().LifeStyle.Transient);
а позже я регистрирую View
container.Register(Component.For<CentrosAdminView>().LifeStyle.Transient.DependsOn(Property.ForKey("DataContext")
.Eq(ViewModelLocator.Centrosviewmodel)));
И определение собственности ViewModelLocator.Centrosviewmodel
:
public static CentrosModel Centrosviewmodel
{
get
{
return App.container.Resolve<CentrosViewModel>();
}
}
Конец редактирования
Я пытаюсь создать приложение Wpf с помощью Castle Windsor и Mvvm Toolkit (galasoft), но я считаю, что моя проблема будет такой же с любым набором инструментов MVVM.
С помощью MVVM вы должны установить DataContext представления для вашей ViewModel. Обычно это делается примерно так в объявлении представления
DataContext={Binding MyViewModelInstanceName,Source={StaticResource Locator}}
Локатор ресурсов определяется в App.xaml следующим образом:
<Application.Resources>
<!--Global View Model Locator-->
<vm:ViewModelLocator x:Key="Locator" />
</Application.Resources>
Если я устанавливаю StartupURI в App.xaml, на мой взгляд, все в порядке. Но если я оставлю StartupUri пустым и попытаюсь получить экземпляр своего представления через замок, используя следующий синтаксис:
container.Resolve<CentrosAdminView>().Show();
Я получаю исключение: "Cannot Find Resource with Name '{Locator}'
Я предполагаю, что Initial DataContext отличается при запуске напрямую, чем при запуске через Castle Windsor, и это причина, по которой он не может найти ресурс.
Мои два вопроса:
- Обязательно ли иметь ViewModelLocator при использовании Castle Windsor? В
- случай Да: как я могу правильно настроить DataContext of Views с помощью
- Виндзор? В случае «Нет»: Каким будет правильный путь?
Я оставляю свою конфигурацию замка. Любая помощь могла бы быть полезна.
Моя конфигурация Windsor выглядит так:
<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>
и по коду:
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;
}