受け入れ答えにフォローアップ、私はそのようにして、どのようにViewModelにファースト・アプローチにWinFormsのブートストラップを実装する方法を紹介したいと思います(良いもの!):あなたが勝った
- ビュー内から直接ViewModelにバインドする必要はありません。このため
我々は(あなたのケースに該当する場合)ウィンドウ上Show
メソッドを呼び出し、そして結合が起こることを可能にしていないことを確認し、ウィンドウマネージャの私たち自身のバージョンを作成する必要があります。
public class WinformsCaliburnBootstrapper<TViewModel> : BootstrapperBase where TViewModel : class
{
private UserControl rootView;
public WinformsCaliburnBootstrapper(ElementHost host)
: base(false)
{
this.rootView = new UserControl();
rootView.Loaded += rootView_Loaded;
host.Child = this.rootView;
Start();
}
void rootView_Loaded(object sender, RoutedEventArgs e)
{
DisplayRootViewFor<TViewModel>();
}
protected override object GetInstance(Type service, string key)
{
if (service == typeof(IWindowManager))
{
service = typeof(UserControlWindowManager<TViewModel>);
return new UserControlWindowManager<TViewModel>(rootView);
}
return Activator.CreateInstance(service);
}
private class UserControlWindowManager<TViewModel> : WindowManager where TViewModel : class
{
UserControl rootView;
public UserControlWindowManager(UserControl rootView)
{
this.rootView = rootView;
}
protected override Window CreateWindow(object rootModel, bool isDialog, object context, IDictionary<string, object> settings)
{
if (isDialog) //allow normal behavior for dialog windows.
return base.CreateWindow(rootModel, isDialog, context, settings);
rootView.Content = ViewLocator.LocateForModel(rootModel, null, context);
rootView.SetValue(View.IsGeneratedProperty, true);
ViewModelBinder.Bind(rootModel, rootView, context);
return null;
}
public override void ShowWindow(object rootModel, object context = null, IDictionary<string, object> settings = null)
{
CreateWindow(rootModel, false, context, settings); //.Show(); omitted on purpose
}
}
}
私はこれが同じニーズを持つ人の役に立てば幸い:
はここで完全なコードです。それは確かに私を救った。
この場合、C.M.あなたが解決するよりも多くのトラブルを引き起こします。 CM。幅広い/自動化されたMVVMフレームワークを使用して、純粋なWPFアプリケーションの「起動と実行」を高速化することを目的としています。あなたのアプリケーションは、フレームワークからビルドの段階を過ぎており、この段階で新しいものを導入することは非常に困難です。 WPVに移行するために、堅実なMVVM(厳しい方法)を適用するのに最も役立つものは何でしょうか。プロジェクトはWinFormsに入っているので、まともなMVC実装で構築されているチャンスはゼロではないため、MVVMへの移行はそれほど苦労しないかもしれません。がんばろう! – EtherDragon