#xamarin #xamarin.forms #inversion-of-control #prism
#xamarin #xamarin.формы #инверсия контроля #prism
Вопрос:
Как я должен использовать контейнеры IoC в моем приложении xamarin forms, использующем платформу Prism MVVM? Нет
Container.Resolve<Interface,Implentation>
Я думаю, нам нужно разрешить IoC и инициализировать в app.xaml.cs. Но я не могу найти правильный способ сделать это.
Кто-нибудь может мне помочь?
Обновить:
Страница:
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
prism:ViewModelLocator.AutowireViewModel="True"
x:Class="CoC.Core.Views.MenuPage">
<ContentPage.Content>
<ListView x:Name="info"
SeparatorVisibility="None"
SeparatorColor="Transparent"
HasUnevenRows="false"
RowHeight="50" BackgroundColor="#485366" >
<ListView.ItemTemplate>
<DataTemplate>
<!--<ImageCell Text="{Binding Title}" ImageSource="{Binding IconSource}" /> -->
<ViewCell>
<!--<Label Text="{Binding Title}" />-->
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentPage.Content>
</ContentPage>
ViewModel:
using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections.ObjectModel;
using Prism.Navigation;
namespace CoC.Core.ViewModels
{
public class MenuPageViewModel : BindableBase , INavigationAware
{
IMenuList _menuList;
public ObservableCollection<MenuItem> ConductList { get; set; }
public void OnNavigatedFrom(NavigationParameters parameters)
{
//throw new NotImplementedException();
}
public void OnNavigatedTo(NavigationParameters parameters)
{
//throw new NotImplementedException();
}
public MenuPageViewModel(IMenuList MenuList)
{
_menuList = MenuList;
ConductList = _menuList.GetMenuList();
}
}
}
ПРИЛОЖЕНИЕ:
using Prism.Unity;
using CoC.Core.Views;
namespace CoC.Core
{
public partial class App : PrismApplication
{
protected override void OnInitialized()
{
InitializeComponent();
//NavigationService.NavigateAsync("MainPage?title=Hello from Xamarin.Forms");
NavigationService.NavigateAsync("MenuPage");
}
protected override void RegisterTypes()
{
Container.RegisterTypeForNavigation<MainPage>();
Container.RegisterTypeForNavigation<RootPage>();
Container.RegisterTypeForNavigation<MenuPage>();
}
}
}
Когда я запускаю этот код, я получаю сообщение об ошибке в Main.cs IOS pro
Ошибка:
Основа.Исключение MonoTouchException
Причина исключения NSInternalLnconistencyException: ожидается, что окно приложения будет иметь корневой контроллер представления в конце приложения.
Комментарии:
1. Установите расширение Visual Studio для пакета шаблонов Prism и с его помощью создайте решение
2. Я сделал. Это не решает проблему
3. Использование контейнера для регистрации вашего интерфейса IMenuList в классе
4. msdn.microsoft.com/en-us/library/ff921149.aspx
5. Я думаю, это для prism в wpf. У вас нет похожих API в Prism MVVM framework для Xamarin.
Ответ №1:
То, что вы ищете, — это метод расширения в Unity. Вам нужно добавить using Microsoft.Practices.Unity
пространство имен в ваш файл кода. С помощью которого вы можете зарегистрировать свои сервисы Container.Register<IService,MyService>()
.
Комментарии:
1. Я добавил пространство имен. В контейнере Unity нет Register, у него есть функция RegisterType . Итак, я добавил
container.RegisterType<IMenu, Menu>();
, но я все еще получаю ту же ошибку.2. Тогда вы делаете что-то не так. Возможно, проблема где-то еще в вашем коде.