衆所周知,CM不支持通過像MVVM Light這樣的NavigationService傳遞複雜類型的對象。所以我搜索了一個解決方法,並做到了這一點。NavigationService WithParam of Caliburn Micro for WP
有兩種視圖模型:MainPageViewModel和SubPageViewModel。
我首先定義了3個類,分別是GlobalData,SnapshotCache和StockSnapshot。 StockSnapshot是我想要在兩個viewmodels之間傳遞的對象的類型。
public class SnapshotCache : Dictionary<string, StockSnapshot>
{
public StockSnapshot GetFromCache(string key)
{
if (ContainsKey(key))
return this[key];
return null;
}
}
public class GlobalData
{
private GlobalData()
{
}
private static GlobalData _current;
public static GlobalData Current
{
get
{
if (_current == null)
_current = new GlobalData();
return _current;
}
set { _current = value; }
}
private SnapshotCache _cachedStops;
public SnapshotCache Snapshots
{
get
{
if (_cachedStops == null)
_cachedStops = new SnapshotCache();
return _cachedStops;
}
}
}
public class StockSnapshot
{
public string Symbol { get; set; }
public string Message { get; set; }
}
接下來,我呼籲MainPageViewModel導航服務是這樣的:
StockSnapshot snap = new StockSnapshot {Symbol="1", Message = "The SampleText is here again!" };
GlobalData.Current.Snapshots[snap.Symbol] = snap;
NavigationService.UriFor<SubPageViewModel>().WithParam(p=>p.Symbol,snap.Symbol).Navigate();
而且在SubPageViewModel我有這樣的:
private string _symbol;
public string Symbol
{
get { return _symbol; }
set
{
_symbol = value;
NotifyOfPropertyChange(() => Symbol);
}
}
public StockSnapshot Snapshot
{
get { return GlobalData.Current.Snapshots[Symbol]; }
}
這就是問題所在。當我運行該程序時,我發現當Symbol尚未初始化時,它總是首先運行到Snapshot的getter。所以後來我嘗試添加一些額外的代碼來消除ArgumentNullException,以便它可以運行到Symbol的setter,然後一切都會很好,除非UI不會更新。
有誰能告訴我我哪裏有錯? Thx提前!
爲什麼不直接註冊GlobalData作爲單例並將其注入需要它的ViewModel? –
我試過只在BootStrapper的GetInstance()上得到一個奇怪的MissingMethodException而不知道錯在哪裏。這是[描述完全相同問題的鏈接](http://stackoverflow.com/questions/8914090/missingmethodexception-caliburn)。 –
奇怪的是,我做了很多,並沒有遇到這種情況。 –