2013-07-16 57 views
0

我有一個Windows 7手機應用程序,我正在努力。我做了幾個帶接口的服務類,但每次我都嘗試瀏覽它們現在崩潰的這些視圖。MVVM Light IoC未綁定?我錯過了什麼?

設置我的項目儘快模擬器負荷加載這些視圖一起來(通過WMAppManifest.xml)

我有這樣的事情

public interface IGpsService 
    { 
     void StartGps(); 
     GeoPosition<GeoCoordinate> CurrentPostion(); 
    } 


public class GpsService : IGpsService 
{ 
    private GeoCoordinateWatcher gpsWatcher; 

    public GpsService() 
    { 
     gpsWatcher = new GeoCoordinateWatcher(GeoPositionAccuracy.Default) 
     { 
      MovementThreshold = 20, 
     }; 

    } 

    public void StartGps() 
    { 
     gpsWatcher.Start(); 
    } 

    public GeoPosition<GeoCoordinate> CurrentPostion() 
    { 
     return gpsWatcher.Position; 
    } 

} 

我的視圖模型定位

static ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

     if (ViewModelBase.IsInDesignModeStatic) 
     { 
      SimpleIoc.Default.Register<IGpsService, Design.GpsDataService>(); 
     } 
     else 
     { 
      SimpleIoc.Default.Register<IGpsService, GpsService>(); 
     } 
     SimpleIoc.Default.Register<AddProductPriceVm>(); 
    } 

// AddProductPrice.xaml.cs

public AddProductPrice(IGpsService gpsService) 
    { 
     InitializeComponent(); 
    } 

Ioc是否只綁定到View模型或其他東西?這就是爲什麼它不工作,因爲我在我的代碼背後有它?

我使用的是背後的代碼和MVVM的混合體,因爲使用代碼後面的事情要容易得多。

錯誤消息

MissingMethodException 
    at System.Activator.InternalCreateInstance(Type type, Boolean nonPublic, StackCrawlMark& stackMark) 
    at System.Activator.CreateInstance(Type type) 
    at System.Windows.Navigation.PageResourceContentLoader.BeginLoad_OnUIThread(AsyncCallback userCallback, PageResourceContentLoaderAsyncResult result) 
    at System.Windows.Navigation.PageResourceContentLoader.<>c__DisplayClass4.<BeginLoad>b__0(Object args) 
    at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark) 
    at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark) 
    at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) 
    at System.Delegate.DynamicInvokeOne(Object[] args) 
    at System.MulticastDelegate.DynamicInvokeImpl(Object[] args) 
    at System.Delegate.DynamicInvoke(Object[] args) 
    at System.Windows.Threading.DispatcherOperation.Invoke() 
    at System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority) 
    at System.Windows.Threading.Dispatcher.OnInvoke(Object context) 
    at System.Windows.Hosting.CallbackCookie.Invoke(Object[] args) 
    at System.Windows.Hosting.DelegateWrapper.InternalInvoke(Object[] args) 
    at System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam[] pParams, ScriptParam& pResult) 

死在NavigationFailed

// Code to execute if a navigation fails 
    private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e) 
    { 
     if (System.Diagnostics.Debugger.IsAttached) 
     { 
      // A navigation has failed; break into the debugger 
      System.Diagnostics.Debugger.Break(); 
     } 
    } 
+0

什麼是錯誤信息? –

+0

奧普忘記發佈了。現在完成。 – chobo2

回答

0

你直接注射服務到視圖,而不是視圖模型。該視圖不是使用SimpleIoc創建的,因此不知道在構造函數中何處解析IGpsService引用。

你最好打賭,如果你想這樣做,就是將IGpsService注入你的viewmodel並將它作爲屬性公開。將DataContextChanged事件添加到視圖中,並在觸發時從視圖模型中取出IGpsService。

編輯:

// AddProductPrice查看

<UserControl 
DataContext="{StaticResource Locator.AddProductPriceVm}"> 

/AddProductPrice.xaml.cs

public AddProductPrice() 
    { 
     InitializeComponent(); 
     DataContextChanged+=DataContextChanged 
    } 
     void DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
     { 
      var context=sender as AddProductPriceVm; 
      if(context!=null) 
       _myGpsService=context.GpsService; 
     } 

// AddProductPriceVm

public class AddProductPriceVm 
{ 
public AddProductPriceVm(IGpsService gpsService) 
{ 
    GpsService=gpsService; 
} 
public IGpsService GpsService{get;set;} 
} 

問題是不是真的DI問題,這只是MVVM Light的工作原理。它期望視圖在它轉換和依賴注入之前就在那裏。如果你想直接在視圖中注入東西,那麼你可以看看使用棱鏡(但它更重,更多的腳手架)。

+0

你能提供一個例子嗎? Ioc也會遭受同樣的問題嗎? – chobo2

+0

因此,切換到Nnject不會解決任何問題。 MVVM燈是如何設計的。我猜你顯示的是推薦的方式來傳遞服務?說如果多個虛擬機需要相同的服務,他們會共享相同的實例還是都有不同的實例? – chobo2