Ответ 1
Вместо реализации первого конструктора я предлагаю вам реализовать ViewModelLocator, например:
public class ViewModelLocator
{
IoCContainer Container { get; set; }
public IUserViewModel UserViewModel
{
get
{
return IoCContainer.Resolve<IUserViewModel>();
}
}
}
Затем в XAML вы объявляете локатор как статический ресурс:
<local:ViewModelLocator x:Key="ViewModelLocator"/>
Во время инициализации вашего приложения необходимо предоставить локатору экземпляр контейнера:
var viewModelLocator = Application.Current.Resources["ViewModelLocator"] as ViewModelLocator;
if(viewModelLocator == null) { // throw exception here }
viewModelLocator.Container = IoCContainer;
Затем в XAML вы можете использовать ресурс чисто:
<UserControl
DataContext="{Binding Path=UserViewModel, Source={StaticResource ViewModelLocator}}"
/>
<!-- The other user control properties -->
Для времени разработки вы можете реализовать MockViewModelLocator:
public class MockViewModelLocator
{
public IUserViewModel UserViewModel
{
get
{
return new MockUserViewModel();
}
}
}
Объявите его в XAML соответствующим образом:
<local:MockViewModelLocator x:Key="MockViewModelLocator"/>
И, наконец, используйте его в своем пользовательском элементе управления:
<UserControl
d:DataContext="{Binding Path=UserViewModel, Source={StaticResource MockViewModelLocator}}"
DataContext="{Binding Path=UserViewModel, Source={StaticResource ViewModelLocator}}"
/>
<!-- The other user control properties -->
Вы можете сделать свой локальный локатор моделей поиска безопасными и легко читаемыми данными для использования Blend, и во время выполнения вы будете использовать свой реальный сервис.
Таким образом, вы не теряете данные о времени разработки, и вам не нужно жертвовать чистотой методологии внедрения зависимостей в ваших моделях просмотра.
Надеюсь, это поможет.