2017-06-12 11 views
0

シンプルなインジェクションとプリズムを使ってシンプルなHelloWorldを試しています。 Git Sourceプリズムとシンプルインジェクタ

アプリケーションが起動すると、このエラーが

を思い付くプロパティ に割り当てることができませんでした 'Prism.Windows.Mvvm.ViewModelLocator.AutoWireViewModel'。 [ライン:8 ポジション:5]スロー」


例外: HelloWorldPrismの 'Windows.UI.Xaml.Markup.XamlParseException':スローPrism.Windows.dll 例外の 'System.MissingMethodException'。 exeファイルWinRTの情報は:プロパティ 「Prism.Windows.Mvvm.ViewModelLocator.AutoWireViewModel」[:8 ポジション:ライン5]に割り当てることができませんでしたタイプ 「Windows.UI.Xaml.Markup.XamlParseException」の例外 に発生しましたHelloWorldPrism.exeが、ユーザコードWinRT の情報で処理されませんでした:プロパティ 'Prism.Windowsへの割り当てに失敗しました.Mvvm.ViewModelLocator.AutoWireViewModel '。 [行:8 位置:5]追加情報:この エラーコードに関連付けられたテキストが見つかりませんでした。プロパティ 'Prism.Windows.Mvvm.ViewModelLocator.AutoWireViewModel'に割り当てられませんでした。 [ライン:8 位置:5]

e.StackTrace」Windows.UI.Xaml.Application.LoadComponent(オブジェクト 成分、ウリresourceLocator、ComponentResourceLocation componentResourceLocation)\ R \ nにおける HelloWorldPrism.Views.MainViewで.InitializeComponent()\ R \ n でHelloWorldPrism.Views.MainView..ctor()」文字列

<Page 
    x:Class="HelloWorldPrism.Views.MainView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:mvvm="using:Prism.Windows.Mvvm" 
    mvvm:ViewModelLocator.AutoWireViewModel="True" 
    mc:Ignorable="d" 
    > 

public MainViewModel(INavigationService navigationService) 
{ 
    _navigationService = navigationService; 
} 

パラメータのないコンストラクタを追加すると正常に動作します。

public MainViewModel() 
{ 
} 

App.cs

protected override Task OnLaunchApplicationAsync(LaunchActivatedEventArgs args) 
{ 
    Window.Current.Activate(); 
    return Task.FromResult(true); 
} 

protected override void CreateAndConfigureContainer() 
{ 
    Logger.Log("Creating and Configuring Container", Category.Debug, Priority.Low); 
    Container = CreateContainer(); 
} 

protected override Container CreateContainer() 
{ 
    return new Container(); 
} 

protected override UIElement CreateShell(Frame rootFrame) 
{ 
    var shell = Container.GetInstance<MainView>(); 
    shell.SetFrame(rootFrame); 
    return shell; 
} 

protected override Type GetPageType(string pageToken) 
{ 
    var type = Type.GetType(string.Format(CultureInfo.InvariantCulture, GetType().AssemblyQualifiedName.Replace(GetType().FullName, GetType().Namespace + ".Views.{0}View"), pageToken)); 
    if (type != null) 
     return type; 
    throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, ResourceLoader.GetForCurrentView("/Prism.Windows/Resources/").GetString("DefaultPageTypeLookupErrorMessage"), pageToken, GetType().Namespace + ".Views"), nameof(pageToken)); 
} 

protected override Task OnInitializeAsync(IActivatedEventArgs args) 
{ 
    Container.RegisterSingleton(SessionStateService); 
    Container.RegisterSingleton(DeviceGestureService); 
    Container.RegisterSingleton(NavigationService); 
    Container.RegisterSingleton(EventAggregator); 
    return Task.CompletedTask; 
} 

protected override void ConfigureViewModelLocator() 
{ 
    ServiceLocator.SetLocatorProvider(() => new 
    SimpleInjectorServiceLocatorAdapter(Container)); 
} 
+1

stacktraceを含めて完全に投稿してください。すべての内部例外。私はあなたがそこで答えを見つけられるでしょう。簡単なインジェクタは、INavigationServiceの登録が欠落していることを明確に述べることがあります。 –

+0

@ Ric.Net Prism新しい出力エラー情報を追加しました。 – rubStackOverflow

答えて

2

アプリケーションが起動すると、このエラーがMainView.xaml

を思い付く、あなたはtrueにAutoWireViewModelプロパティを定義した場合。このプロパティがTrueに設定されると、ViewModelLocatorは特定の規約に基づいて対応するViewModelをインスタンス化しようとします。 ViewおよびViewModelの名前が規約に適合しているため、このプロパティをtrueに設定すると、Prismは対応するViewModelのインスタンス化を支援します。

Prism.mvvm名前空間内にあるViewModelLocationProviderクラスは、添付プロパティがtrueに設定されたAutoWireViewModelChangedビューのビューモデルを検索します。そして、エラーがViewModelLocationProviderクラスの次のコード行でスローされます。

/// <summary> 
/// The default view model factory which provides the ViewModel type as a parameter. 
/// </summary> 
static Func<Type, object> _defaultViewModelFactory = type => Activator.CreateInstance(type); 

System.MissingMethodException:「このオブジェクトのために定義されていませんパラメータなしのコンストラクタ」

これは、Activator.CreateInstance(Type)メソッドがpublicコンストラクタを必要とするために発生します。MissingMethodExceptionを参照してください。

パラメータのないコンストラクタを追加すると正常に動作します。

これは正しい解決策であるようです。 ViewModelのパラメータのないコンストラクタが必要ない場合は、インスタンス化してDataContextViewに設定してください。これがPrismライブラリの問題であると疑われる場合は、おそらくスレッドhereを開くことができます。

更新:@rubStackOverflowによると

、それはOnInitializeAsync法上のViewModelLocationProvider.SetDefaultViewModelFactory((viewMo‌​delType) => Container.GetInstance(viewModelType));がありませんでした。

+0

@ sunteen-wu-msft 'OnModelLocationProvider.SetDefaultViewModelFactory((viewModelType)=> Container.GetInstance(viewModelType));' OnInitializeAsync'で 'が見つかりませんでした。 – rubStackOverflow

+0

@rubStackOverflow、ありがとうございます。 –

関連する問題