无法创建Prism shell

时间:2016-03-07 10:17:49

标签: c# mvvm prism

当我尝试创建Prism shell时,我得到以下异常:

  

类型的例外   ' Microsoft.Practices.ServiceLocation.ActivationException'发生在   Microsoft.Practices.ServiceLocation.dll但未在用户中处理   代码

     

其他信息:尝试获取时发生激活错误   MainWindowViewModel类型的实例,键""

这是我的Bootstrapper类:

 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>

1 个答案:

答案 0 :(得分:3)

ICustomer的注册发生在MainWindowViewModel之后,因此无法解决。

在引导程序中的Container.RegisterType<ICustomer, Customer>();中移动ConfigureContainer,你没事。它应该看起来像

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