Подтвердить что ты не робот

Могу ли я как-то рассказать Resharper о типе ViewModel?

У нас есть Views и ViewModels в разных сборках. Views 'имеет ссылку на виртуальные машины. (иногда нам нужен код).

ViewModel DataContext устанавливается в коде, а не в XAML. Таким образом, ни VS, ни Resharper не могут помочь, как с intellisense, и Resharper также дает много предупреждений.

Есть ли какая-либо директива для Resharper, которую мы можем установить в комментариях XAML, чтобы сказать, что мы намерены использовать View с VM определенного типа?

Update:

Nice blogpost в дополнение к принятому ответу.

4b9b3361

Ответ 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.