Edited at

(解決)Xamarin Prism.Forms でViewModelがインスタンス化されない

More than 1 year has passed since last update.

Prism.Forms でViewModelがインスタンス化されない問題にはまったのでメモ

個人的にはxaml系のアプリは画面遷移の仕組みが重要と考えており、

下記URLにて紹介されていたPrismの新しい画面遷移の機能を試していました。

https://blog.okazuki.jp/entry/2018/07/17/114318

Prism.Formsがpreview版だったので、

Xamarinのバージョンなどがあっていないせいか

ビルドが通らずいろいろ試行錯誤した結果画面遷移はするようになったものの

ViewModelがインスタンス化されなくなってしまいました。


開発環境

Version

OS
Windows 10 バージョン 1804

Microsoft Visual Studio Community 2017
15.7.5

Microsoft .NET FrameworkVersion
4.7.03056

Xamarin
4.10.10.2 (35a01d8dc)


開発環境(NuGet Manager)

Package
Version

Prism.Unity.Forms
7.1.0.172-pre

NETStandard.Library
2.0.3

Xamarin.Forms
3.1.0.561732-pre4


問題

Android Simulaterにて実機デバッグ中にViewModel側でブレイクポイントを張っても止まらない。

xaml側でのBindingも全く動作しないため、ViewModelがインスタンス化されていなさそう。


原因

Prism.Formsでは、View と ViewModel の命名規則が一致していれば、

自動でViewModelのインスタンスが生成される(紐づけも一緒に行ってくれるみたい)

原因としては、この命名規則が守れていなかった。

しょうもない原因ですが、

ViewModelのファイルを格納するフォルダを手動で作成したので

ViewModelとなっていたことが原因でした。

誤 : ViewModel

正 : ViewModels


namespace プロジェクト名.ViewModels // ← namespaceも一致させないといけない
{
public class SliderSampleViewModel : ViewModelBase
{

}
}

View側のnamespaceも Views でないといけない。


namespace プロジェクト名.Views
{
public partial class SliderSample : ContentPage
{
public SliderSample()
{
InitializeComponent();
}
}
}


対策

まとめると以下のように命名規則をそろえる必要があります。


namespace

-ViewModels

-Views


ViewとViewModelの関連

例) SampleView ⇔ SampleViewModel


参考

下記のページがきっかけでインスタンス化されないことに気づけました。ありがとうございました。

http://www.nuits.jp/entry/2017/02/22/120046