2015-11-04 95 views
0

我一直在重構我的工作解決方案,使用多個程序集作爲可重用模塊。它具有以下組件覆蓋mvvmcross查看定位器

App.Framework - 整個解決方案的各個方面共同的項目, App.Core - mvvmcross核心, App.StartupModule - 爲應用程序的不同部分模塊的一部分,在其他項目中可重複使用,它包含自己的回購,服務和視圖模型。 App.WindowsApp.Android

我已成功地解決了viewodellocator和具有從所述模塊的類型assemnly並使用以下來啓動應用程序,其中startupView是該特定的默認視圖模塊。

 var method = this.GetType().GetMethod("RegisterAppStart", BindingFlags.FlattenHierarchy) 
      .MakeGenericMethod(startupView); 
     method.Invoke(this, null); 

所以應用程序運行,一路過關斬將核心,然後到WindowsPhone的應用程序,當它試圖找到logonviewmodel它打破了相關的看法。命名空間已經從

App.Core.ViewModels.[VIEWMODELNAME] -> App.StartupModule.ViewModels.[VIEWMODELNAME] 

改變這是調試跟蹤的部分地方我認爲是失敗的

mvx:Diagnostic: 84.00 Error seen during navigation request to LogonViewModel - error KeyNotFoundException: Could not find view for App.StartupModule.ViewModels.LogonViewModel 
     at Cirrious.MvvmCross.Views.MvxViewsContainer.GetViewType(Type viewModelType) 
    at Cirrious.MvvmCross.WindowsCommon.Views.MvxWindowsViewPresenter.Show(MvxViewModelRequest request) 

視圖位於命名空間

App.WindowsPhone.Views 

,所以我猜我的問題是 1.是否有一種簡單的方法告訴viewdispatcher/viewlocator在項目中查看[VIEWMODELNAME]類型的視圖 2. is重寫映射更好嗎?以及如何去做這件事? 3.有什麼其他建議要重寫以修復此問題? 4.從什麼看到這將需要在每個平臺上實現一些東西,即時通訊猜測沒有通用的方式來處理這個所有平臺?

在此先感謝

回答

1

好的,在許多不同的事情嘗試錯誤嘗試後,我找到了解決問題的辦法。它不是特別優雅,需要一些重構,但你需要做的。 1.在您的UI項目的設置中,您需要添加組裝件,然後世界再次變好,解決方案繼續運行,但它需要在每個平臺上進行。而不是視圖程序集

protected override System.Reflection.Assembly[] GetViewModelAssemblies() 
    { 
     // return base.GetViewModelAssemblies(); 

     var result = base.GetViewModelAssemblies(); 
     var assemblyList = result.ToList(); 

     var assemblyType = typeof(SBG.NBOL.StartupModule.ViewModels.LogonViewModel); 
     assemblyList.Add(assemblyType.GetTypeInfo().Assembly); 
     return assemblyList.ToArray(); 
    } 
2

視圖分辨率不參與該意見被宣佈納入考慮的命名空間。因此,在您的視圖定義的命名空間中無關緊要。

按照慣例,映射工作在類型名稱的基礎上。因此,如果您執行ShowViewModel<FirstViewModel>(),它將嘗試查找名爲FirstView的視圖。它將嘗試在本機iOS或Android應用的程序集中查找該視圖。

如果您已經在不同的裝配體中定義了該視圖,則可以覆蓋特定於平臺的Setup類的AndroidViewAssemblies屬性。

+0

這就是我認爲會發生,但是做出我的更改後,它不能再找到我的UI項目,這是工作正常之前的看法?所以不知道發生了什麼然後:/ – Barry

+0

我shuold可能會補充說,我已覆蓋導航,並使用此 公共無效導航(類型viewModelType,對象參數) { ShowViewModel(viewModelType,parameters); } – Barry

+0

您是否在與本機iOS,Windows或Android項目不同的程序集中定義了視圖? – Stephanvs