我刚刚调查了或多或少相同的问题......实际上,我所做的是遵循MvvMLight的原则。准确地说,我使用了 ViewModelLocator(它或多或少是静态的),以便在运行时或设计时注入“正确”的 ViewModel。神奇之处在于MvvMLight 框架提供的函数ViewModelBase.IsInDesignModeStatic 。最后,我的ViewModelLocator类看起来像
public class ViewModelLocator
{
private static readonly IKernel _kernel;
static ViewModelLocator()
{
_kernel = new StandardKernel();
if (ViewModelBase.IsInDesignModeStatic)
{
_kernel.Bind<IBasicVM>().To<DesignBasicVm>();
}
else
{
_kernel.Bind<IBasicVM>().To<BasicVm>();
}
}
public IBasicVM BasicVm { get { return _kernel.Get<IBasicVM>(); } }
}
你可以忽略忍者 _kernel,但如果您使用 IoC 构建 ViewModel,您可能需要它(或类似的 Ioc)。
App.xaml 将ViewModelLocator声明为资源
<Application.Resources>
<ResourceDictionary>
<viewModel:ViewModelLocator x:Key="ViewModelLocator" />
</ResourceDictionary>
</Application.Resources>
MainWindow.DataContext属性绑定到ViewModelLocator的BasicVM成员。Text 属性绑定了接口IBasicVM的GetContent成员,该成员由 R# 静态识别(至少 R# 7.1 与 VS2012)
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
DataContext="{Binding BasicVm, Source={StaticResource ViewModelLocator}}"
>
<Grid>
<TextBlock Text="{Binding GetContent}"/>
</Grid>
</Window>
您可以查看我作为模板创建的这个存储库。