Я построил небольшой локатор видов.
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 во время разработки.
Ошибка
