2016-05-13 17 views
0

UserControlviewmodelにバインドされています。 viewmodelには、依存関係注入を介して行われるコンストラクタ内のパラメータがあります。この時点まで、依存性注入は正常に動作しています。UnityContentからUserControl ViewModelからCustomUsercontrolへの注入Viewmodel

そして、UserControl1Viewで使用されているCustomUserControlがあります。 私はCustomUserControlに依存性注入を働かせますか?

私は依存症注入を初めて経験しており、いくつかの研究を行っていますが、それを機能させるようには見えません。 enter image description here

ここでは、コードの例です:私は、これは誤りである

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() 
    } 
} 

答えて

2

ソリューションは簡単です。コントロールを注入するためにDI/IoCコンテナを使用しないでください。それはうまくいっておらず、決して働くことはない。

(ビューとは対照的に)ユーザーコントロールは、自己完結型であり、他のアプリケーションやコンテナを必要としないIDEデザイナーと一緒にすぐに使用できます。 XamlデザイナーはDI/IoCの概念を持たず、特定のクラスを解決/インスタンス化する方法を知らず、パラメータのないコンストラクタを必要とするため、設計者はうまく機能しません。また、「ユーザーコントロール」は、そのロジックをViewModelに分割しません。

反対側のビューは、コードなしのUIテンプレートです。 WindowsまたはUserControlクラスから派生していますが、それ自身のロジックはなく、再利用できません。ビューは常に特殊なViewModelに特化しており、ViewModelはというアプリケーション固有のものです。ビュー1の場合はDIを使用しますが、ViewModelを挿入するためにのみ使用します(ビューファーストまたはViewModelファーストアプローチの場合)。あなたのVMは、あなたの答えのために

+0

こんにちはおかげで、それはあなたが考えること以上のことを助けMVVMの全体の目的を打つあなたのビューへの参照を持っているとして、サイドノートで

、あなたのUserControl1ViewModelはMVVMに違反します。私は次のことを疑問に思います。WPFについては、ビューまたはユーザーコントロールは原則として同じものではありませんか?簡単にするために、すべてのWPFウィンドウ/ビューはこの特定のプロジェクトのユーザコントロールです。そして私は、プロジェクト内で共有されているすべてのusercontrolsが存在する共有と呼ばれるフォルダを持っています。私のusercontrolは、プロジェクトの外で使用する必要はありませんので、私はviewmodelが注入されているビューモデルにリンクしたいです。 – user1702369

+0

技術的にはそうですが、私が言ったように:Viewはロジックがないので、コードはありません。 CalendarControl(ユーザーコントロール)は、カレンダーを描画し、コードビハインドの一部であるクリックなどを処理し、アプリケーション固有のビューモデルがバインドできるDependencyPropertiesを公開する必要があります。純粋な見方では、DPsは必要ありません – Tseng

関連する問題