我有UserControl
绑定到viewmodel
。 viewmodel
在构造函数中有参数,这些参数是通过依赖注入完成的。到目前为止,依赖注入工作正常。
然后我在我的CustomUserControl
中使用了UserControl1View
。
如何在我的CustomUserControl
?
我是依赖注入的新手并做了一些研究,但似乎无法让它发挥作用。
我收到错误public partial class UserControl1View : UserControl, IView {
public UserControl1View( ) {
InitializeComponent( );
}
}
以下是代码示例。
用户控件:
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()
}
}
答案 0 :(得分:3)
解决方案很简单。不要使用DI / IoC容器来注入控件。它不会工作,从来没有工作过。
用户控件(与视图相反)意味着是独立的,可以与其他应用程序或IDE设计人员一起使用,无需容器。否则他们只是不会与设计师合作,因为Xaml设计师没有DI / IoC的概念,并且不知道如何解析/实例化某个类并且需要无参数构造函数。也是一个&#34;用户控件&#34;没有将它的逻辑拆分成ViewModel。
另一方面的视图只是一个没有代码的UI模板。它也来自Windows
或UserControl
类,但它没有自己的逻辑,也不可重复使用。对于特殊的ViewModel,视图始终非常具体,而ViewModel非常特定于一个应用程序。对于视图,一个可以使用DI,但仅用于注入ViewModel(即取决于您是使用View-first还是ViewModel-first方法)。
另一方面,您的UserControl1ViewModel
违反了MVVM,因为您的VM引用了您的View,这超出了MVVM的全部目的