2

在windows phone应用程序中,我有一个自定义用户控件,它是一个BookProgressInfo类的实例的数据绑定。用非默认构造函数注入视图模型依赖关系

<deusControls:BookProgressBar BookProgressValue="{Binding BookProgressInfo}" Width="430" /> 

每当BookProgressInfo变化,一个

static void BookProgressValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
     { 
      var bookProgressBar = (BookProgressBar)sender; 

      var progressInfo = (BookProgressInfo) e.NewValue; 

      if(progressInfo != null && progressInfo.Id != 0) 
       bookProgressBar.ProgressBarListBox.DataContext = new BookProgressBarViewModel(progressInfo, bookProgressBar.Width); 
     } 

被调用。每当整个控件的绑定属性发生更改时,我在bookProgressBar.ProgressBarListBox上设置一个新的DataContext。

我以前只有一个BookProgressBarViewModel,所以一切工作正常,在上面的代码片段中实现。

现在我想支持不同的BookProgressBarViewModel s,所以我介绍了一个接口 - IBookProgressBarViewModel。

如您所见,BookProgressBarViewModel的构造函数具有参数。

我使用Ninject内核作为IoC容器,它在App.xaml中启动。

如何创建在BookProgressValueChanged内的IoC容器中定义的相应IBookProgressBarViewModel的实例?

更新:我已经改变了架构,以便我不需要从依赖项属性更改事件处理程序中调用参数化视图模型构造函数。不过,我想听听你对这个问题的建议。

+0

我认为Ninject允许您注册和反对哪些必需的参数。或者是其他问题呢?我想我可能会错过这里的观点。 – Vitalij

+0

@Vitalij,在'NinjectModule'中,可以将参数传递给依赖关系的构造函数,甚至可以将委托传递给方法来计算这些参数。但在我看来,只有在视图是必需的时候才能知道这些值。没有办法事先生成这些实例。但是现在我想我可以有一个类'viewModelParametersProvider',并且在需要依赖的时候将它称为Ninject模块中初始化方法的例程。 –

回答

0

为什么不仍然使用IoC容器,然后使您的值Lazy Loaded?然后,您的IoC可以注入您的依赖关系并创建这些实例,直到您知道它的值,然后在需要时更新它的属性。

相关问题