'System.Reflection.TargetInvocationException'(内部MVVM Light)

时间:2015-02-01 13:56:27

标签: c# windows-phone-8 mvvm mvvm-light

我使用了MVVM Light工具包,当我在ViewModelLocator中加载ViewModel实例时,我得到了异常类型' System.Reflection.TargetInvocationException'发生在mscorlib.ni.dll但未在用户代码中处理。我搜索了很多,但还无法找到解决方案

我的ViewModelLocator代码:

    /*
  In App.xaml:
  <Application.Resources>
      <vm:ViewModelLocator xmlns:vm="clr-namespace:ToDoList"
                           x:Key="Locator" />
  </Application.Resources>

  In the View:
  DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName}"

  You can also use Blend to do all this with the tool's support.
  See http://www.galasoft.ch/mvvm
*/

using Cimbalino.Phone.Toolkit.Services;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Ioc;
using GalaSoft.MvvmLight.Messaging;
using Microsoft.Practices.ServiceLocation;
using System.Windows;

namespace ToDoList.ViewModel
{
    /// <summary>
    /// This class contains static references to all the view models in the
    /// application and provides an entry point for the bindings.
    /// </summary>
    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>();
            ////}

            if (!SimpleIoc.Default.IsRegistered<IMarketplaceReviewService>())
            {
                SimpleIoc.Default.Register<IMarketplaceReviewService, MarketplaceReviewService>();
            }

            SimpleIoc.Default.Register<ToDoViewModel>();
        }

        public ToDoViewModel ToDo
        {
            get
            {
                return ServiceLocator.Current.GetInstance<ToDoViewModel>();
            }
        }


        public static void Cleanup()
        {
            // TODO Clear the ViewModels
            var viewModelLocator = (ViewModelLocator)Application.Current.Resources["Locator"];
            viewModelLocator.ToDo.Cleanup();

            Messenger.Reset();
        }
    }
}

我的ToDoViewModel:

using Cimbalino.Phone.Toolkit.Services;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using ToDoList.Models;

namespace ToDoList.ViewModel
{
   public class ToDoViewModel : ViewModelBase
    {

       private readonly IMarketplaceReviewService _marketplaceReviewService;
       public ICommand DeleteCommand { get; private set; }
       public ICommand AddCommand { get;  set; }
       public ICommand RateCommand { get; private set; }
       public string Text { get;  set; }

        // LINQ to SQL data context for the local database.
        private ToDoDataContext toDoDB;

        // Class constructor, create the data context object.
        public ToDoViewModel(string toDoDBConnectionString, IMarketplaceReviewService marketplaceReviewService)
        {


            _marketplaceReviewService = marketplaceReviewService;
            toDoDB = new ToDoDataContext(toDoDBConnectionString);
            DeleteCommand = new RelayCommand<ToDoItem>(DeleteToDoItem);
            AddCommand = new RelayCommand(Add);
            LoadCollectionsFromDatabase();
            RateCommand = new RelayCommand(Rate);

        }

        private void Rate()
        {
            _marketplaceReviewService.Show();
        }
        private void Delete(ToDoItem newToDoItem)
        {
            //ToDoItem newToDoItem = obj as ToDoItem;

            DeleteToDoItem(newToDoItem);
        }

        private void Add()
        {
          ToDoItem newToDoItem = new ToDoItem
          {
              ItemName = this.Text,

          };
          AddToDoItem(newToDoItem);
        }

        //
        // TODO: Add collections, list, and methods here.
        //

        // Write changes in the data context to the database.
        public void SaveChangesToDB()
        {
            toDoDB.SubmitChanges();
        }


        // All to-do items.
        private ObservableCollection<ToDoItem> _allToDoItems;
        public ObservableCollection<ToDoItem> AllToDoItems
        {
            get { return _allToDoItems; }
            set
            {
                _allToDoItems = value;
                NotifyPropertyChanged("AllToDoItems");
            }
        }




        public void LoadCollectionsFromDatabase()
        {

            // Specify the query for all to-do items in the database.
            var toDoItemsInDB = from ToDoItem todo in toDoDB.Items
                                select todo;

            // Query the database and load all to-do items.
            AllToDoItems = new ObservableCollection<ToDoItem>(toDoItemsInDB);

            // Specify the query for all categories in the database.






        }
        // Add a to-do item to the database and collections.
        public void AddToDoItem(ToDoItem newToDoItem)
        {
            // Add a to-do item to the data context.
            toDoDB.Items.InsertOnSubmit(newToDoItem);

            // Save changes to the database.
            toDoDB.SubmitChanges();

            // Add a to-do item to the "all" observable collection.
            AllToDoItems.Add(newToDoItem);


        }
        // Remove a to-do task item from the database and collections.
        public void DeleteToDoItem(ToDoItem toDoForDelete)
        {

            // Remove the to-do item from the "all" observable collection.
            AllToDoItems.Remove(toDoForDelete);

            // Remove the to-do item from the data context.
            toDoDB.Items.DeleteOnSubmit(toDoForDelete);



            // Save changes to the database.
            toDoDB.SubmitChanges();
        }
        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        // Used to notify the app that a property has changed.
        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion

    }
}

异常发生在enter image description here

enter image description here

1 个答案:

答案 0 :(得分:3)

实际上,您的ViewModelLocator无法创建 ToDoViewmodel 的实例,因为您的TodoViewmodel需要两个参数类型IMarketplaceReviewService类型和其他toDoDbConnectionString字符串。

注意: - IMarketplaceReviewService类型参数来自ViewmodelLocator,因为您已经注册了它但是您的第二个参数toDoDbConnectionString并非来自任何地方,因此ToDoViewModel是没有实例化。

第一个解决方案: - 这是快速的法律解决方法(因为我不知道您的连接字符串是要更改还是保持不变)。所以改变你的TodoViewModel构造函数如下: -

public ToDoViewModel(IMarketplaceReviewService marketplaceReviewService)
    {
        // Save your connection string somewhere in Constant Class
        // Use that constants directly here.
        _toDoDbConnectionString = "Your Connection string";
        ...
    }

第二个解决方案: - 您可以创建Setting - ISetting(类 - 接口)对,并在传递IMarketplaceReviewService时将其传递给它,并在ViewModelLocator中注册它。

希望它会有所帮助:)