C# IoC.xB4;t构建对象

C# IoC.xB4;t构建对象,c#,wpf,caliburn.micro,C#,Wpf,Caliburn.micro,我是Caliburn的新手,必须使用Caliburn.micro扩展现有程序 我需要将视图中的DataContext设置为具有一些propertyinjected参数的ViewModel。所有这些都应该有效,所以我只需要建立它。 但事实并非如此!下面是我试图创建的代码: public ProductionMainView() { InitializeComponent(); var gg = IoC.Get<ProductionMainViewModel>();

我是Caliburn的新手,必须使用Caliburn.micro扩展现有程序

我需要将视图中的DataContext设置为具有一些propertyinjected参数的ViewModel。所有这些都应该有效,所以我只需要建立它。 但事实并非如此!下面是我试图创建的代码:

public ProductionMainView()
{
     InitializeComponent(); 
     var gg = IoC.Get<ProductionMainViewModel>();
     IoC.BuildUp(gg);
     this.DataContext = gg;
}
public ProductionMainView()
{
初始化组件();
var gg=IoC.Get();
国际奥委会组织(gg);
this.DataContext=gg;
}
据我所知,我需要获取对象,然后构建它。 现在我应该得到一个视图“包含”我的ViewModel,但是该视图是空的, 我希望我已经解释清楚了。
向您致意首先,您使用的是一个非常旧的版本,当前版本是2.0.2,您仍然需要在引导程序中对GetInstance、GetAllInstance、Building方法进行覆盖,或者为Ninject使用一个变体

上面的链接对此有一些来源

请记住,视图的Codebehind中几乎没有代码。。。它将全部进入ViewModels(大部分情况下)。ShellView=>ShellViewModel with in-ShellViewModel
var gg=IoC.Get()
根据您的意图,您可以将其绑定到一个
,在yoru viewmodel中有一个名为该属性的属性。CM将出动并优化ViewModel和相关视图,并自动将它们混合在一起。屏幕上的预期结果应该是该contentcontrol位置中的ProductViewModel

 public class ShellViewModel : Screen
 {
       private ProductViewModel _productViewModel;

       public ShellViewModel (){


       }

       protected override void OnActivate(){

         ProductViewModel = IoC.Get<ProductViewModel>();
       }
       public ProductViewModel ProductViewModel {
          get{ return _productViewModel;}
          set{
                _productViewModel = value;
                NotifyOfPropertyChanged (); // 2.0.2 feature...
          }
      }
  }
公共类ShellViewModel:屏幕
{
private ProductViewModel\u ProductViewModel;
公共ShellViewModel(){
}
受保护的覆盖无效OnActivate(){
ProductViewModel=IoC.Get();
}
公共产品视图模型ProductViewModel{
获取{return\u productViewModel;}
设置{
_productViewModel=值;
NotifyOfPropertyChanged();//2.0.2功能。。。
}
}
}
现在,如果您决定升级到最新版本,将会有一些细微的变化,一个
引导程序已经不存在了,它被重构为引导数据库。下一个Initialize()将放在引导程序()的ctor中。从那时起,一切都将基于您的启动屏幕,即在启动覆盖中调用CTOR中的Initialize()后,您将调用
DisplayRootViewFor()

有人说,我倾向于同意使用
IoC.Get()
可能是反模式的,使用时要小心。有时事情会发生意想不到的变化。他们倾向于通过CTOR对项目进行DI,并从那里相应地使用

/*version 1.52*/
public class Bootstrapper : BootStrapper<LoginViewModel>{

    public Bootstrapper(){

        Start();
    }

    protected override Configure(){

        /* -- your Ninject configurations -- */
    }

    protected override object GetInstance(Type service, string Key){
        if(service == null)
           throw new ArgumentNullException("Service");
       return _kernel.Get(service);
    }

    protected override IEnumerable<object> GetAllInstances(Type service){

      return _kernel.GetAll(service);
    }

    protected override void BuildUp(object instance){
      _kernel.Inject(instance);
    }

    protected override void OnExit(object sender, EventArgs e)
    {
        kernel.Dispose();
        base.OnExit(sender, e);
    }

 }
/*版本1.52*/
公共类引导程序:引导程序{
公共引导程序(){
Start();
}
受保护的覆盖配置(){
/*--您的Ninject配置--*/
}
受保护的覆盖对象GetInstance(类型服务,字符串键){
if(服务==null)
抛出新的异常(“服务”);
return_kernel.Get(服务);
}
受保护的重写IEnumerable GetAllInstances(类型服务){
return_kernel.GetAll(服务);
}
受保护的覆盖空洞堆积(对象实例){
_注入(实例);
}
受保护的覆盖void OnExit(对象发送方、事件参数)
{
Dispose();
base.OnExit(发送方,e);
}
}

要澄清您是否必须登录才能访问ProductionMainViewModel?是什么决定了让ProductionMainViewModel均匀显示的逻辑?

如果对象是由Unity自己创建的,为什么要调用Building。而是用决心。另外,您在ProductMainViewModel对象中有哪些依赖项?另外,ProductMainViewModel中的这些依赖项是否用
[Dependency]
属性标记?不必构建或设置datacontext。在视图的构造函数中也肯定没有什么可做的。你可以发布你的项目或一个样本项目,这样我们就可以看到你迄今为止做了什么。我感觉你的配置有点不对劲。。。你的引导程序是什么样子的?@vendettamit我没有使用[Dependency],因为它不是一个统一项目。我的引导程序如下所示:抱歉链接,没有足够的字符发布。谢谢你的回答!!一切都准备好了。ProductionManiViewModel是一个包含多个视图的“主视图”。然而,问题是ProductionManiViewModel的构造函数没有被正确调用,该构造函数已注入所有其他ViewModels依赖项,所以视图是空的,我不知道如何解决这个问题,换一种方式说:ProductionMainViewModel没有被调用,我不知道怎么做,因为它有所有的属性注入。我知道你给我展示了你的配置覆盖。您当前的应用程序是否运行1.52或更早?如果你更新到2.0.2会有伤害吗?少量的更新可能会对应用程序的启动流程略有帮助。因为LoginViewModel是您引导程序的起点,所以我相信这就是您的Shell。这就是调用
IoC.Get()
的地方,用注入来初始化viewmodel。你的工作流程有点不对劲。。不想消极,只想看到更多。。