Xamarin
Xamarin.Forms
Prism.Forms

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

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