11

我们在不同的程序集中有视图和视图模型。Views 的程序集具有对 VM 的引用。(有时我们需要后面的代码)。

ViewModel 的 DataContext 是在代码中设置的,而不是在 XAML 中。因此,无论是 VS,Resharper 都不能像智能感知那样提供帮助,并且 Resharper 也给出了很多警告。

我们可以在 XAML 注释中为 Resharper 设置任何指令来说明我们打算将 View 与特定类型的 VM 一起使用吗?

更新:

不错的文作为已接受答案的补充。

4

2 回答 2

10

我遇到了同样的问题,并通过使用 XAML 中的设计时支持在 XAML 编辑器中获得智能感知支持来解决它,这也满足 Resharper 绑定验证。

请注意下面代码片段中使用的 d: 命名空间。这将在运行时被忽略。您还可以使用 ViewModelLocator,它将设计时(假)存储库添加到 IoC 容器,从而消除来自外部源(如 Web 服务或其他数据源)的任何依赖项。

XAML 设计时支持:

<local:ViewBase
    ...
    mc:Ignorable="d" 
    d:DataContext="{Binding Source={d:DesignInstance Type=viewModel:MainViewModel, IsDesignTimeCreatable=True}}">

XAML 视图模型定位器:

<local:ViewBase
    ...
    mc:Ignorable="d" 
    viewModel:ViewModelLocator.ViewModel="MainViewModel" >

视图模型定位器:

    static ViewModelLocator()
    {
        if (DesignMode.DesignModeEnabled)
        {
            Container.RegisterType<IYourRepository, YourDesignTimeRepository>();
        }
        else
        {
            Container.RegisterType<IYourRepository, YourRuntimeRepository>();
        }

        Container.RegisterType<YourViewModel>();
    }
于 2012-12-30T10:51:16.740 回答
1

如果您将 ViewModel 设置为 XAML 中 UIElement 的 .DataContext 属性作为占位符,则当您在运行时通过构造函数注入的 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 支持,因为它们可以反映来自 XAML Datacontext 的 ViewModel。但也享受依赖注入视图模型的好处,因为虚拟机将在运行时从您的 DI 容器中替换。

于 2012-12-13T16:20:50.267 回答