众所周知,CM不支持通过像MVVM Light这样的NavigationService传递复杂类型的对象。所以我搜索了一个解决方法,就这样做了。
有两个视图模型: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]; }
}
这就是问题所在。当我运行程序时,我发现当Symbol尚未初始化时,它总是先运行到Snapshot的getter。所以后来我尝试添加一些额外的代码来消除ArgumentNullException,以便它可以运行到Symbol的setter,然后一切正常,除了UI无论如何都没有得到更新。
有谁能告诉我哪里出错了? Thx提前!!
答案 0 :(得分:0)
为什么不使用:
private string _symbol;
public string Symbol
{
get { return _symbol;}
set
{
_symbol = value;
NotifyOfPropertyChange(() => Symbol);
NotifyOfPropertyChange(() => Snapshot);
}
}
public StockSnapshot Snapshot
{
get { return Symbol!=null? GlobalData.Current.Snapshots[Symbol]:null; }
}
在这种情况下,当Symbol为null(无论如何都是明智的方法!)时,你不会尝试从GlobalData获取数据。当设置“Symbol”时,你在Snapshot上调用NotifyOfPropertyChange()来强制重新获取属性