众所周知,CM 不支持通过 NavigationService 传递复杂类型的对象,例如 MVVM Light。所以我搜索了一种解决方法并这样做了。
有两个视图模型:MainPageViewModel 和 SubPageViewModel。
我首先定义了 3 个类,分别是 GlobalData、SnapshotCache 和 StockSnapshot。StockSnapshot 是我想在 2 个视图模型之间传递的对象的类型。
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]; }
}
这就是问题所在。当我运行程序时,我发现它总是先运行到 Snapshot 的 getter,而此时 Symbol 还没有被初始化。所以后来我尝试添加一些额外的代码来消除 ArgumentNullException 以便它可以运行到 Symbol 的设置器,然后一切都很好,只是 UI 无论如何都不会更新。
谁能告诉我哪里错了?提前谢谢!!