よく知られているように、CM は MVVM Light のような NavigationService を介した複合型のオブジェクトの受け渡しをサポートしていません。そこで、回避策を探して、このようにしました。
MainPageViewModel と SubPageViewModel の 2 つのビューモデルがあります。
まず、GlobalData、SnapshotCache、StockSnapshot という 3 つのクラスを定義しました。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 のセッターに対して実行できるようにしましたが、UI がとにかく更新されないことを除いて、すべてがうまくいきます。
どこが間違っているのか誰か教えてもらえますか? 事前にthx!!