1

よく知られているように、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 がとにかく更新されないことを除いて、すべてがうまくいきます。

どこが間違っているのか誰か教えてもらえますか? 事前にt​​hx!!

4

1 に答える 1

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() を呼び出してプロパティの再取得を強制します。

于 2012-06-22T10:36:07.137 に答える