我创建了一个Prism Unity App(来自prism扩展包 - 非常好),添加了2个新视图并在视图之间设置了基本导航。这一切都很好,没有任何打嗝。
我真正想要的是使用DryIoc(公司政策)。所以我继续删除Unity包(Unity和Prism.Unity.Forms)并安装了DryIoc包(DryIoc和Prism.DryIoc.Forms)。修复App.xaml使用正确的命名空间(xmlns:prism =" clr-namespace:Prism.DryIoc; assembly = Prism.DryIoc.Forms")并修复所有其他引用以使用DryIoc而不是Unity References。
这一切都编译并运行,没有任何例外。但是当我调试时,很明显AutoWireup无法按预期工作(至少我预期如此)。 ViewModel的构造函数(或任何其他位置)中的断点未被命中,并且Title绑定不会通过。
我缺少配置/设置或参考吗?
我的代码: App.xaml中:
<?xml version="1.0" encoding="utf-8" ?><prism:PrismApplication xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:prism="clr-namespace:Prism.DryIoc;assembly=Prism.DryIoc.Forms"
x:Class="XamFormsPrism.App"></prism:PrismApplication>
App.xaml.cs:
public partial class App : Prism.DryIoc.PrismApplication
{
public App(IPlatformInitializer initializer = null) : base(initializer) { }
protected override void ConfigureContainer()
{
base.ConfigureContainer();
}
protected override void OnInitialized()
{
this.InitializeComponent();
this.NavigationService.NavigateAsync(NavigationLinks.MainPage);
}
protected override void RegisterTypes()
{
this.Container.RegisterTypeForNavigation<MainPage>();
this.Container.RegisterTypeForNavigation<ViewA>();
this.Container.RegisterTypeForNavigation<ViewB>();
}
}
MainPage.xaml中:
<?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="XamFormsPrism.Views.MainPage"
Title="MainPage"><StackLayout HorizontalOptions="Center" VerticalOptions="Center">
<Label Text="{Binding Title}" />
<Button Text="{Binding NavigateText}" Command="{Binding NavigateCommand}" /> </StackLayout></ContentPage>
MainPageViewModel.cs:
public class MainPageViewModel : BindableBase, INavigationAware
{
private INavigationService navigationService = null;
private string _title = "Jose Cuervo";
public string Title
{
get { return _title; }
set { SetProperty(ref _title, value); }
}
public DelegateCommand NavigateCommand { get; private set; }
public MainPageViewModel(INavigationService navigationService)
{
this.navigationService = navigationService;
this.NavigateCommand = new DelegateCommand(this.navigate, this.canNavigate);
}
private void navigate()
{
this.navigationService.NavigateAsync("ViewA");
}
private bool canNavigate()
{
return true;
}
public void OnNavigatedFrom(NavigationParameters parameters)
{
}
public void OnNavigatedTo(NavigationParameters parameters)
{
if (parameters.ContainsKey("title"))
Title = (string)parameters["title"] + " and Prism";
}
}
如上所示,我使用PageName&amp; amp;的标准命名约定。 PageNameViewModel,AutoWireUp设置为True。
这一切都适用于Unity,但我在DryIoc中遗漏了一些东西......但是让我感到惊讶的是什么。
我搜索了整个项目,Unity没有任何参考或痕迹。
非常感谢任何帮助。
答案 0 :(得分:1)
我终于有时间再看看这个。如果我在容器中显式注册ViewModels,一切正常。因此,我猜测DryIoC容器中缺少规则,或者在使用DryIoC时,您必须明确注册ViewModel。