0

我有一个正在开发的 Windows 7 手机应用程序。我制作了几个带有接口的服务类,但每次我尝试导航这些视图时,它们现在都会崩溃。

我将我的项目设置为在模拟器加载后立即加载其中一个视图(通过 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 是否只绑定到视图模型或其他东西?这就是为什么它不能像我在我的代码中那样工作的原因吗?

我正在使用代码背后和 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)

导航失败

   // 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();
        }
    }
4

1 回答 1

0

您将服务直接注入视图,而不是视图模型。视图不是使用 SimpleIoc 创建的,因此不知道在构造函数中解析 IGpsService 引用的位置。

如果您想这样做,最好的选择是将 IGpsService 注入您的视图模型并将其作为属性公开。将 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 的工作原理。它期望视图在执行和依赖注入之前就在那里。如果您想将内容直接注入视图中,那么您可以考虑使用 Prism(但它的重量要大得多,需要更多的脚手架)。

于 2013-07-23T08:34:22.740 回答