1

众所周知,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 无论如何都不会更新。

谁能告诉我哪里错了?提前谢谢!!

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 为空时,您不会尝试从 GlobalData 获取数据(无论如何都是明智的方法!),并且当设置“Symbol”时,您在快照上调用 NotifyOfPropertyChange() 以强制重新获取属性。

于 2012-06-22T10:36:07.137 回答