windows-8 - SimpleIoC - 在缓存中找不到类型 : Windows. UI.Xaml.Controls.Frame

标签 windows-8 windows-store-apps winrt-xaml mvvm-light ioc-container

第一次通过 SimpleIoC 实例化我的 ViewModel 时,我遇到了以下错误。我相信我已经按应有的方式设置了容器,但由于某种原因,我仍然收到以下错误。任何想法或帮助将不胜感激。

    Microsoft.Practices.ServiceLocation.ActivationException was unhandled by user code
  HResult=-2146233088
  Message=Type not found in cache: Windows.UI.Xaml.Controls.Frame.
  Source=GalaSoft.MvvmLight.Extras
  StackTrace:
       at GalaSoft.MvvmLight.Ioc.SimpleIoc.DoGetService(Type serviceType, String key) in c:\Users\Public\Downloads\CodePlex\MVVMLight\GalaSoft.MvvmLight\GalaSoft.MvvmLight.Extras (NET35)\Ioc\SimpleIoc.cs:line 532
       at GalaSoft.MvvmLight.Ioc.SimpleIoc.GetService(Type serviceType) in c:\Users\Public\Downloads\CodePlex\MVVMLight\GalaSoft.MvvmLight\GalaSoft.MvvmLight.Extras (NET35)\Ioc\SimpleIoc.cs:line 768
       at GalaSoft.MvvmLight.Ioc.SimpleIoc.MakeInstance[TClass]() in c:\Users\Public\Downloads\CodePlex\MVVMLight\GalaSoft.MvvmLight\GalaSoft.MvvmLight.Extras (NET35)\Ioc\SimpleIoc.cs:line 708
  InnerException:

以下是与此相关的我的代码片段:

ViewModelLocator.cs(位于我的Win8项目中)

public class ViewModelLocator
{
    /// <summary>
    /// Initializes a new instance of the ViewModelLocator class.
    /// </summary>
    public ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        if (ViewModelBase.IsInDesignModeStatic)
        {
            // Create design time view services and models
            //SimpleIoc.Default.Register<IDataService, DesignDataService>();
        }
        else
        {
            // Create run time view services and models
            //SimpleIoc.Default.Register<IDataService, DataService>();
            SimpleIoc.Default.Register<INavigationService, NavigationService>();
            SimpleIoc.Default.Register<IParseService, ParseService>();
            SimpleIoc.Default.Register<IServiceHandler, ServiceHandler>();
        }

        SimpleIoc.Default.Register<MainViewModel>();
        SimpleIoc.Default.Register<ActionViewModel>();
    }

    public MainViewModel MainVM
    {
        get
        {
            return ServiceLocator.Current.GetInstance<MainViewModel>();
        }
    }

    public ActionViewModel ActionVM
    {
        get
        {
            return ServiceLocator.Current.GetInstance<ActionViewModel>();
        }
    }

    public static void Cleanup()
    {
        // TODO Clear the ViewModels
    }
}

MainViewModel.cs 构造函数

public class MainViewModel : ViewModelBase
{
    #region Variables

    private readonly INavigationService _navigationService;
    private readonly IParseService _parseService;

    #endregion

    /// <summary>
    /// Initializes a new instance of the MainViewModel class.
    /// </summary>
    public MainViewModel(INavigationService navigationService, IParseService parseService)
    {
        if (IsInDesignMode)
        {
            // Code runs in Blend --> create design time data.
        }
        else
        {
            _navigationService = navigationService;
            _parseService = parseService;
            BuildCommonData();
        }
    }

最佳答案

我知道这早就该发生了,但这里是我的 NavigationService 类的实现中的有问题的代码。

NavigationService 类(之前)

public class NavigationService : INavigationService
{
    /// <summary>
    /// Gets the root frame.
    /// </summary>
    private Frame RootFrame;

    public NavigationService(Frame rootFrame)
    {
        RootFrame = rootFrame;
    }

    public event NavigatingCancelEventHandler Navigating;

    public void Navigate<T>(object parameter = null)
    {
        var type = typeof(T);
        RootFrame.Navigate(type, parameter);
    }

    public void Navigate(string type, object parameter = null)
    {
        RootFrame.Navigate(Type.GetType(type), parameter);
    }

    public void GoBack()
    {
        if (RootFrame.CanGoBack)
        {
            RootFrame.GoBack();
        }
    }

    public void GoForward()
    {
        if (RootFrame.CanGoForward)
        {
            RootFrame.GoForward();
        }
    }
}

我只是取出了构造函数,并将 RootFrame 私有(private)变量设置为属性。就像这样:

public class NavigationService : INavigationService
{
    /// <summary>
    /// Gets the root frame.
    /// </summary>
    private static Frame RootFrame
    {
        get { return Window.Current.Content as Frame; }
    }

    public event NavigatingCancelEventHandler Navigating;

    public void Navigate<T>(object parameter = null)
    {
        var type = typeof(T);
        RootFrame.Navigate(type, parameter);
    }

    public void Navigate(string type, object parameter = null)
    {
        RootFrame.Navigate(Type.GetType(type), parameter);
    }

    public void GoBack()
    {
        if (RootFrame.CanGoBack)
        {
            RootFrame.GoBack();
        }
    }

    public void GoForward()
    {
        if (RootFrame.CanGoForward)
        {
            RootFrame.GoForward();
        }
    }
}

很简单,我知道,但希望它有用。

关于windows-8 - SimpleIoC - 在缓存中找不到类型 : Windows. UI.Xaml.Controls.Frame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17175893/

相关文章:

c# - 如何将本地存储图像复制到剪贴板 WinRT

python - 按下时创建一个按钮在python 3.3的输入框中打印该按钮上的数字

Outlook 加载项自动更新

c# - Windows 应用商店应用程序用户控制项目上的 "Xaml Parsing Failed"

windows-store-apps - 是否可以自动将应用程序提交到 Windows 应用商店?

hardware - 推荐用于 Windows 8 Metro 开发的硬件?

windows-8 - VS2012/混合 5 : Debugging an Exception (only) occurring in design view

c# - 返回第一页后第二页不刷新数据

xaml - C#/XAML Metro 应用程序中的 DatePicker 控件?

windows-8 - 如何禁用 Windows 8 (WinRT) 锁定屏幕