Я использую Prism + Unity в приложении wpf с использованием MVVM. Я начинаю с Призма и Единства.Injection Constructor Unity
Я хочу иметь возможность закрыть текущий вид. В различных решениях и статьях, которые я прочитал, говорится, что лучший способ сделать это - из модели представления. Но для модели просмотра требуется объект менеджера региона, чтобы закрыть представление. Итак, давайте создадим инъекцию конструктора. Никогда не пробовал это раньше, но есть много вопросов о SO, которые справляются с этим.
Позвольте мне начать с объяснения того, как вещи связаны друг с другом. У меня есть класс bootstrapper, который обрабатывает регистрацию типов и экземпляров.
Вот как зарегистрирован мой вид и вид модели:
container.RegisterType<IViewModel, ViewAccountsViewModel>(new InjectionConstructor(new ResolvedParameter(typeof(RegionManager))));
container.RegisterType<ViewAccountsView>();
Вот модуль для представления счетов вид:
public class ViewAccountsModule : IModule
{
private readonly IRegionManager regionManager;
private readonly IUnityContainer container;
public ViewAccountsModule(IUnityContainer container, IRegionManager regionManager)
{
this.container = container;
this.regionManager = regionManager;
}
/// <summary>
///
/// </summary>
public void Initialize()
{
regionManager.RegisterViewWithRegion("MainRegion",() => this.container.Resolve<ViewAccountsView>());
}
}
В моей ViewAccountsView.xaml, я устанавливаю данные контекст так:
<Grid.DataContext>
<vm:ViewAccountsViewModel/>
</Grid.DataContext>
И мой вид модели конструктора:
[InjectionConstructor]
public ViewAccountsViewModel(IRegionManager regionManager)
{
if (regionManager == null) throw new ArgumentNullException("regionManager");
this.regionManager = regionManager;
}
При компиляции решения появляется сообщение о том, что тип «ViewAccountsViewModel» не содержит доступных конструкторов. Если я добавлю конструктор по умолчанию в мою модель представления, отобразится представление, но я не могу удалить представление из региона. Я получаю аргумент null исключение.
Вот код для удаления вида:
regionManager.Regions["MainRegion"].Remove(regionManager.Regions["MainRegion"].GetView("ViewAccountsView"));
Я еще очень начинающий с IoC и DI. Есть что-то, что я пропустил?
Добавить конструктор по умолчанию и поставить точку останова на этом constuctor. Если это будет работать (остановка в точке останова), чем что-то не так с вашей регистрацией (проверьте все повторно заданные объекты, если они все уже зарегистрированы). –
Я хотел добавить, что если я перейду на 'container.RegisterType();' отобразится мое представление, но я не могу удалить представление. Мой перегруженный конструктор не вызван. –