Могу ли я как-то рассказать Resharper о типе ViewModel?
У нас есть Views и ViewModels в разных сборках. Views 'имеет ссылку на виртуальные машины. (иногда нам нужен код).
ViewModel DataContext устанавливается в коде, а не в XAML. Таким образом, ни VS, ни Resharper не могут помочь, как с intellisense, и Resharper также дает много предупреждений.
Есть ли какая-либо директива для Resharper, которую мы можем установить в комментариях XAML, чтобы сказать, что мы намерены использовать View с VM определенного типа?
Update:
Nice blogpost в дополнение к принятому ответу.
Ответы
Ответ 1
У меня была одна и та же проблема, и я разрешил ее, используя поддержку времени разработки в XAML, чтобы получить поддержку intellisense в редакторе XAML, которая также удовлетворяет проверке привязки Resharper.
Обратите внимание на пространство имен d:, используемое в нижеприведенном фрагменте кода. Это будет игнорироваться во время выполнения. Вы также можете использовать ViewModelLocator, который добавит репозитории времени разработки (Fake) в контейнер IoC, удалив любые зависимости от внешних источников, таких как веб-службы или другие источники данных.
Поддержка времени разработки XAML:
<local:ViewBase
...
mc:Ignorable="d"
d:DataContext="{Binding Source={d:DesignInstance Type=viewModel:MainViewModel, IsDesignTimeCreatable=True}}">
XAML ViewModelLocator:
<local:ViewBase
...
mc:Ignorable="d"
viewModel:ViewModelLocator.ViewModel="MainViewModel" >
ViewModelLocator:
static ViewModelLocator()
{
if (DesignMode.DesignModeEnabled)
{
Container.RegisterType<IYourRepository, YourDesignTimeRepository>();
}
else
{
Container.RegisterType<IYourRepository, YourRuntimeRepository>();
}
Container.RegisterType<YourViewModel>();
}
Ответ 2
Если вы установите ViewModel в свойство .DataContext UIElement в вашем XAML в качестве заполнителя, он будет заменен, когда вы установите его во время выполнения через ваш конструктор, в который вводится ViewModel.
Итак, у вас может быть
<UserControl.DataContext>
<Pages:WelcomeLoadingViewModel />
</UserControl.DataContext>
Затем в конструкторе UserControls
public WelcomeLoading(WelcomeLoadingViewModel viewModel)
{
this.DataContext = viewModel;
}
ИЛИ
public HomePage()
{
this.InitializeComponent();
this.DataContext = ViewModelResolver.Resolve<HomePageViewModel>();
Это означало бы, что вы получите поддержку Binding и Resharper, поскольку они могут отображать ViewModels из XamL Datacontext. Но также пользоваться преимуществами Injected ViewModels Dependancy Injected ViewModels, поскольку VM будет заменена во время выполнения из вашего контейнера DI.