Joel Joseph
Joel Joseph

Reputation: 6169

'System.Reflection.TargetInvocationException' (Inside MVVM Light)

I used MVVM Light toolkit and when i load the ViewModel Instance in the ViewModelLocator i get the exception An exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.ni.dll but was not handled in user code . I Searched a lot but couldn't find the solution yet

My ViewModelLocator Code:

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

My 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

    }
}

The exception occurs at the enter image description here

enter image description here

Upvotes: 2

Views: 3138

Answers (1)

loop
loop

Reputation: 9242

Actually your ViewModelLocator is not able to create the instance of ToDoViewmodel because your TodoViewmodel need two parameter one is of type IMarketplaceReviewService type and other toDoDbConnectionString of string.

Note :- IMarketplaceReviewService type parameter is coming from ViewmodelLocator as you registered it already But your Second parameter toDoDbConnectionString is not coming from anywhere so ToDoViewModel is not getting instantiated.

First Solution :- This is quick legal workaround( as I don't know whether you connection string is going to change or Remain constant). So change your TodoViewModel constructor like this :-

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

Second Solution :- You can create Setting - ISetting(Class-Interface) pair and pass it similarly as you passed IMarketplaceReviewService and also registered it in ViewModelLocator.

Hope It'll help :)

Upvotes: 3

Related Questions