我们在不同的程序集中有Views和ViewModel。视图的程序集具有对VM的引用。 (有时我们需要代码)。
ViewModel的DataContext是在代码中设置的,而不是在XAML中。因此,VS和Resharper都不能提供帮助,因为intellisense和Resharper也提供了很多警告。
是否有任何针对Resharper的指令我们可以在XAML注释中设置我们打算使用View与特定类型的VM?
更新:
尼斯 博文 作为已接受答案的补充。
我们在不同的程序集中有Views和ViewModel。视图的程序集具有对VM的引用。 (有时我们需要代码)。
ViewModel的DataContext是在代码中设置的,而不是在XAML中。因此,VS和Resharper都不能提供帮助,因为intellisense和Resharper也提供了很多警告。
是否有任何针对Resharper的指令我们可以在XAML注释中设置我们打算使用View与特定类型的VM?
更新:
尼斯 博文 作为已接受答案的补充。
我遇到了同样的问题并通过使用XAML中的设计时支持来解决它,以便在XAML编辑器中获得智能感知支持,该编辑器也满足Resharper绑定验证。
请注意下面的代码段中使用的d:名称空间。这将在运行时被忽略。您还可以使用ViewModelLocator,它将设计时(Fake)存储库添加到IoC容器中,从Web服务或其他数据源等外部源中删除任何依赖项。
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>();
}
如果将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。但也享受Dependancy Injected ViewModels的好处,因为VM将在运行时从您的DI Container中替换。