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