小さなビューロケーターを作成しました。
public abstract class ViewModelLocatorBase : IViewModelLocator
{
private readonly static bool isExecutingInDesignMode =
DesignMode.DesignModeEnabled;
public IViewModel ViewModel
{
get { return isExecutingInDesignMode
? LocateDesignTimeViewModel()
: LocateRuntimeViewModel(); }
}
protected abstract IViewModel LocateDesignTimeViewModel();
protected abstract IViewModel LocateRuntimeViewModel();
}
より具体的なビューロケーターを構築するために使用されます
public class UserEditorViewModelLocator : ViewModelLocatorBase
{
protected override IViewModel LocateDesignTimeViewModel()
{
return new UserEditorViewModelDesignTime();
}
protected override IViewModel LocateRuntimeViewModel()
{
return new UserEditorViewModelRunTime();
}
}
これらは正しいビューモデルを見つけるためにビューで使用されます
public abstract class ViewBase : UserControl
{
public ViewBase()
{
BindViewModelLocatorToView(viewModelLocator: GetViewModelLocator());
}
protected abstract IViewModelLocator GetViewModelLocator();
protected void BindViewModelLocatorToView(IViewModelLocator viewModelLocator)
{
if (viewModelLocator != null)
{
DataContext = viewModelLocator.ViewModel;
}
}
}
派生ビューに正しいビュー ロケーターを提供することにより (最終的には IoC を介して挿入します)
public sealed partial class UserEditorScreen : ViewBase
{
public UserEditorScreen()
{
this.InitializeComponent();
}
protected override IViewModelLocator GetViewModelLocator()
{
return new UserEditorViewModelLocator();
}
}
現在、これはすべて実行時には完全に機能しますが、デザイン時には BindViewModelLocatorToView への呼び出しが原因でビューが壊れます。私はこれらのビュー ロケーターを Xaml で StaticResources として直接使用していたので、設計時にはそのように動作するように見えますが、ビューのコンストラクターで DataContext を設定するように変更されたため、設計時の ViewModel がありません。
エラー