Unity依赖注入从usercontrol viewmodel到customUsercontrol Viewmodel

时间:2016-05-13 09:18:59

标签: c# wpf mvvm unity-container

我有UserControl绑定到viewmodelviewmodel在构造函数中有参数,这些参数是通过依赖注入完成的。到目前为止,依赖注入工作正常。

然后我在我的CustomUserControl中使用了UserControl1View。 如何在我的CustomUserControl

中使用依赖注入工作

我是依赖注入的新手并做了一些研究,但似乎无法让它发挥作用。

我收到错误
public partial class UserControl1View : UserControl, IView {
    public UserControl1View( ) {
        InitializeComponent( );
    }
}  

这是错误: enter image description here

以下是代码示例。

用户控件

public partial class UserControl1View : UserControl, IView {
    public UserControl1View( ) {
        InitializeComponent( );
    }
}

UserControlViewModel

public class UserControl1ViewModel 
{
    private readonly ISomeDataService dataService;
    public UserControl1ViewModel (ISomeDataService dataservice, IUnityContainer container ) 
    {
       //Please note that the Dependency injection still works in this class, to much to explain the whole structure.   
       this.dataService = dataservice;
       container.RegisterType( typeof( IView ), typeof( CustomUserControlView ) ); 
       var view = container.Resolve<CustomUserControlView>( );
    }

XAML

<uc:CustomUserControlView/>

CustomUserControl

public partial class CustomUserControlView : UserControl, IView 
{
    public CustomUserControlView(IUnityContainer container) 
    {
        container.RegisterType( typeof( IViewModel ), typeof( CustomControlViewModel ) );
        var viewModel = container.Resolve<CustomControlViewModel>( );
        this.DataContext = viewModel;
        InitializeComponent( );
    }
}

CustomUserControlViewModel

public partial class CustomUserControlViewModel : UserControl, IView 
{
   private readonly ISomeDataService dataService;
   public CustomUserControlViewModel(ISomeDataService dataservice) 
   {
      var data = dataService.GetsomeCollection()
   }
}

1 个答案:

答案 0 :(得分:3)

解决方案很简单。不要使用DI / IoC容器来注入控件。它不会工作,从来没有工作过。

用户控件(与视图相反)意味着是独立的,可以与其他应用程序或IDE设计人员一起使用,无需容器。否则他们只是不会与设计师合作,因为Xaml设计师没有DI / IoC的概念,并且不知道如何解析/实例化某个类并且需要无参数构造函数。也是一个&#34;用户控件&#34;没有将它的逻辑拆分成ViewModel。

另一方面的视图只是一个没有代码的UI模板。它也来自WindowsUserControl类,但它没有自己的逻辑,也不可重复使用。对于特殊的ViewModel,视图始终非常具体,而ViewModel非常特定于一个应用程序。对于视图,一个可以使用DI,但仅用于注入ViewModel(即取决于您是使用View-first还是ViewModel-first方法)。

另一方面,您的UserControl1ViewModel违反了MVVM,因为您的VM引用了您的View,这超出了MVVM的全部目的