2012-06-21 54 views
1

衆所周知,CM不支持通過像MVVM Light這樣的NavigationService傳遞複雜類型的對象。所以我搜索了一個解決方法,並做到了這一點。NavigationService WithParam of Caliburn Micro for WP

有兩種視圖模型:MainPageViewModel和SubPageViewModel。

我首先定義了3個類,分別是GlobalData,SnapshotCache和StockSnapshot。 StockSnapshot是我想要在兩個viewmodels之間傳遞的對象的類型。

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

爲什麼不直接註冊GlobalData作爲單例並將其注入需要它的ViewModel? –

+0

我試過只在BootStrapper的GetInstance()上得到一個奇怪的MissingMethodException而不知道錯在哪裏。這是[描述完全相同問題的鏈接](http://stackoverflow.com/questions/8914090/missingmethodexception-caliburn)。 –

+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; }  
} 

在這種情況下,你不嘗試,並獲得全球國際數據時符號爲空(明智的做法,反正!),當「符號」設置你叫NotifyOfPropertyChange ()在快照上強制重新獲取該屬性。

+0

它似乎是一種解決方法。無論如何,這對我來說工作得很好。結果發現Caliburn Micro的最新版本存在問題。在我將它更新到最新版本之後,事情進展順利。 :) –