Xamarin Forms Prism 自動初始化
本篇文章介紹的是Prism在7.2版本後支援的新功能,
實做該功能可達到ViewModel自動初始化,
可以節省掉許多程式碼。
以往當要將參數傳遞到下一個ViewModel,
而下一個畫面又需要顯示該參數的值時,
都要在下一個ViewModel中將收到的參數再設定到屬性上:
public string MyValue
{
get { return _myValue; }
set { SetProperty(ref _myValue, value); }
}
private string _myValue;
public override void Initialize(INavigationParameters parameters)
{
base.Initialize(parameters);
var myValue=parameters.GetValue<string>("MyValue");//接收上一頁來的參數
this.MyValue = myValue;//設定到屬性上顯示
}
基於以上的情境,Prism提供了自動初始化讓NavigationService與DialogService在傳遞參數時,
會自動幫你設值到對應的屬性上。
首先在接收參數的ViewModel需要繼承Prism.AppModel.IAutoInitialize,
該介面不需要實作任何方法或屬性:
接著在需要自動初始化的屬性上,
幫它掛上特性類別AutoInitialize。
[AutoInitialize(true)]
public string MyValue
{
get { return _myValue; }
set { SetProperty(ref _myValue, value); }
}
當你準備透過NavigationService傳遞參數時,
傳遞的Key必須要與自動初始化的屬性名稱相同,不需撰寫其他程式,就會自動將值帶到MyValue上。
AutoInitialize需帶一個布林值參數,表示是否該參數為必填,
如果設定為True時卻沒有傳遞該參數,
則在巡覽的時候會擋住不讓你到下一頁:
但有時候還是會無法避免傳遞的參數與下一頁的屬性名稱不相同的情形,
也沒法隨意更動參數名或屬性名,因為可能一改就壞很多東西。
這時候可以在AutoInitialize上指定傳來的Key參數名稱。
執行的結果:
當然不是只有字串可以這樣傳遞,
使用物件也可以用相同方式傳遞接收物件。
在接收參數的時候會用KEY的名稱以StringComparison.InvariantCultureIgnoreCase找到對應的參數,
所以只有大小寫不一樣也是OK的。
var p = new NavigationParameters() { { "model", new MyModel() } };
this.NavigationService.NavigateAsync("PrismContentPageA?data=指定名稱",p);
[AutoInitialize(true)]
public MyModel Model { get; set; }
範例連結
https://github.com/stevenchang0529/Xamarin.Lab.PrismAutoInitialization