Вместо реализации первого конструктора, я предлагаю вам реализовать 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, и во время выполнения вы будете использовать свой реальный сервис.
Таким образом, вы не потеряете данные времени проектирования и не должны жертвовать чистотой методологии внедрения зависимостей в ваших моделях представления.
Надеюсь, это поможет.