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

我的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

    }
}

异常(exception)发生在

最佳答案

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

注意:-IMarketplaceReviewService类型参数来自于您已经注册的ViewmodelLocator,但是您的Second参数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(类接口(interface))对,并通过与传递IMarketplaceReviewService相似的方式传递它,并在ViewModelLocator中注册它。

希望对您有所帮助:)

关于c# - 'System.Reflection.TargetInvocationException'(在MVVM中),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28263460/

10-10 02:07