2015-02-01 3 views
2

MVVM Light 툴킷을 사용하고 ViewModelLocator에서 ViewModel 인스턴스를로드 할 때 예외가 발생합니다. mscorlib.ni에서 'System.Reflection.TargetInvocationException'유형의 예외가 발생했습니다. .dll하지만 사용자 코드에서 처리되지 않았습니다. 아직'System.Reflection.TargetInvocationException'(내 MVVM Light)

내 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

에서 발생

+0

도움을 바랍니다. 저것을 보십시요. 당신이 viewmodellocator에서 그것을 어떻게 전달할 수 있는지 .. – loop

답변

3

실제로 ViewModelLocator는 n입니다. 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에 등록 마찬가지로 그것을 전달할 수 있습니다. >는 todoviewmodel 생성자에 "toDoDBConnectionString"매개 변수를 전달하지 -

내가 문제가 있다고 생각 그것은 :