2016-03-07 56 views
0

我出现以下情况例外,当我尝试创建棱镜外壳:无法创建棱镜外壳

型 “Microsoft.Practices.ServiceLocation.ActivationException”的异常出现在 Microsoft.Practices。尝试获取类型MainWindowViewModel的 实例时发生激活错误,“”键

:ServiceLocation.dll但在用户 代码

其他信息没有处理

这是我的引导程序类:

public class Bootstrapper : UnityBootstrapper 
    { 
     protected override DependencyObject CreateShell() 
     { 
      return Container.TryResolve<MainWindow>(); 

     } 

     protected override void InitializeShell() 
     { 
      Application.Current.MainWindow.Show(); 
     } 
    } 

App类:

public partial class App : Application 
    { 
     protected override void OnStartup(StartupEventArgs e) 
     { 
      base.OnStartup(e); 

      Bootstrapper bs = new Bootstrapper(); 
      bs.Run(); 

      bs.Container.RegisterType<ICustomer, Customer>(); 

     } 

    } 

和App.xaml中:

<Application x:Class="MVVMPractice2.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Application.Resources> 

    </Application.Resources> 

</Application> 

ViewModel类:

public class MainWindowViewModel : BindableBase 
    { 
     //instantiate the model 
     public ICustomer customer; 

     //property for button click command 
     public DelegateCommand UpdateCommand { get; set; } 


     //constructor to instantiate the buttons click command 
     public MainWindowViewModel(ICustomer customer) 
     { 
      this.customer = customer; 


      UpdateCommand = new DelegateCommand(() => {customer.CalculateTax();OnPropertyChanged(() => TaxAmount);}, customer.IsValid); 

     } 


     //this property maps customer name from model to the view 
     public string TxtCustomerName 
     { 
      get { return customer.CustomerName; } 
      set { customer.CustomerName = value; } 
     } 

     //this property maps amount from model to the view 
     public string TxtAmount 
     { 
      get { return Convert.ToString(customer.Amount); } 
      set { customer.Amount = Convert.ToDouble(value); } 
     } 


     //this property maps and transforms color from model to the view 
     public string LblAmountColor 
     { 
      get 
      { 
       if (customer.Amount > 2000) 
       { 
        return "Blue"; 
       } 
       else if (customer.Amount > 1500) 
       { 
        return "Red"; 
       } 
       return "Yellow"; 
      } 
     } 

     //this property maps and transforms married from model to the view 
     public bool IsMarried 
     { 
      get 
      { 
       if (customer.Married == "Married") 
       { 
        return true; 
       } 

       else if (customer.Married == "UnMarried") 
       { 
        return false; 
       } 

       return false; 

      } 

      set 
      { 
       if (value) 
       { 
        customer.Married = "Married"; 
       } 

       else 
       { 
        customer.Married = "UnMarried"; 
       } 
      } 



     } 

     //this property maps tax from model to the view 
     public string TaxAmount 
     { 
      get { return Convert.ToString(customer.Tax); } 

     } 

    } 
} 

查看XAML:

<Window x:Class="MVVMPractice2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:prism="http://prismlibrary.com/" 
     prism:ViewModelLocator.AutoWireViewModel="True" 
     Title="MainWindow" Height="350" Width="525"> <!--PRISM POWER--> 
    <Grid> 
     <Label Content="Customer Name" HorizontalAlignment="Left" Margin="0,0,0,292.8"></Label> 
     <Label Name="lblName" HorizontalAlignment="Left" Margin="108,0,0,292.8" Width="37" Content="{Binding TxtCustomerName}"></Label> 

     <Label Content="Sales Amount" HorizontalAlignment="Left" Margin="0,28,0,264.8"></Label> 
     <TextBox Name="lblAmount" HorizontalAlignment="Left" Margin="101,28,0,264.8" Width="44" Text="{Binding TxtAmount}"></TextBox> 

     <Label Content="Buying Habits" HorizontalAlignment="Left" Margin="0,56,0,236.8"></Label> 
     <Label Name="lblBuyingHabits" HorizontalAlignment="Left" Margin="108,56,0,236.8" Width="52" Background="{Binding LblAmountColor}"></Label> 

     <Label Content="Married" HorizontalAlignment="Left" Margin="0,84,0,208.8" Width="62"></Label> 
     <CheckBox Name="chkMarried" HorizontalAlignment="Left" Margin="102,84,0,208.8" IsChecked="{Binding IsMarried}"></CheckBox> 

     <Label Content="Tax" HorizontalAlignment="Left" Margin="0,112,0,180.8"></Label> 
     <TextBlock Name="lblTax" HorizontalAlignment="Left" Margin="108,117,0,175.8" Width="37" Text="{Binding TaxAmount}"></TextBlock> 

     <Button Name="btnTax" Content="Calculate Tax" Margin="118,158,287.4,123.8" Command="{Binding UpdateCommand}" ></Button> 

    </Grid> 
</Window> 
+0

你可以发布视图和viewmodel?而顺便说一句,你应登记客户里面'ConfigureContainer' ...,并确保'Application.Current.MainWindow'实际设定,'InitializeShell'应该这样做。 – Haukinger

+0

InnerException可能包含有关错误的重要信息。你可以发布吗? –

回答

2

ICustomer注册碰巧创造MainWindowViewModel之后,所以它不能被解决。

移动Container.RegisterType<ICustomer, Customer>();在在引导程序,你很好。它应该看起来像

protected override void ConfigureContainer() 
{ 
    base.ConfigureContainer(); 
    Container.RegisterType<ICustomer, Customer>(); 
} 
+0

谢谢。我这样做了,但现在它在bs.Run()上失败......它说:“Microsoft.Practices.Unity.ResolutionFailedException中发生未处理的异常类型的Microsoft.Practices.Unity.dll 附加信息:解析依赖失败,type =“Microsoft.Practices.ServiceLocation.IServiceLocator”,name =“(none)”。 发生异常时:解析时 异常:InvalidOperationException - 当前类型Microsoft.Practices。 ServiceLocation.IServiceLocator,是一个接口,不能构造,你是否缺少类型映射?......“ – Ivan

+1

看看UnityContainer.ConfigureContainer的来源 - 它注册了很多东西... – Haukinger

+0

谢谢再次为您提供帮助。如果你有时间,请看到我面对的另一个问题:http://stackoverflow.com/questions/35846743/cant-navigate-using-prism – Ivan