用于WP的Caliburn Micro的NavigationService WithParam

时间:2012-06-21 13:01:16

标签: c# windows-phone-7 caliburn.micro

众所周知,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提前!!

1 个答案:

答案 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()来强制重新获取属性