好的,我正在为此烦恼,所以任何帮助都将不胜感激!
我正在使用 MVVM 模式构建 WPF 应用程序。
为了在设计时获取数据,我将 Ninject 依赖注入框架与服务定位器结合使用(很像http://jonas.follesoe.no/YouCardRevisitedImplementingDependencyInjectionInSilverlight.aspx上的文章中的示例
(因为我使用的是 WPF 而不是 Silverlight,所以我检查设计时属性的方式略有不同,但我相信它是适用的)。
我无法让它在设计时工作,无论我做什么,绑定似乎都没有被调用。它在运行时工作正常。
这是我的 Ninject 模块的代码:
public class ViewModelModule : StandardModule
{
public override void Load()
{
bool isRuntime = !ViewModelBase.IsInDesignMode;
if (isRuntime)
{
Bind<IViewModel>().To<MyViewModel>();
}
else
{
Bind<IViewModel>().To<MyDesignTimeViewModel>();
}
}
}
MyDesignTimeViewModel
是一个普通的 CLR 对象,它返回硬编码数据来代替MyViewModel
.
服务定位器如下:
public class ViewModelLocator
{
private static IKernel kernel;
static ViewModelLocator()
{
if (kernel == null)
{
kernel = new StandardKernel(new ViewModelModule());
}
}
public IViewModel ViewModel
{
get
{
var vm = kernel.Get<IViewModel>();
return vm;
}
}
}
XAML 将页面的 DataContext 绑定如下(尽管我尝试了几种不同的声明方式,结果都相同):
<Page.DataContext>
<Binding Source="{StaticResource viewModelLocator}" Path="ViewModel" />
</Page.DataContext>
(其中 viewModelLocator 在合并在此文件顶部的 ResourceDictionary 中声明)。
正如我所说,这在运行时工作正常,即使我在运行时切换我的 Ninject 绑定以使用 MyDesignTimeViewModel ,它也会成功显示虚拟数据。我的一个绑定中有一个虚拟转换器,以查看传递了什么,这在运行时而不是在设计时被调用(我整天都在疯狂地使用单独的 Visual Studio 进程调试设计时实例,因为根据 MSDN 的建议!)
在设计时,Ninject 绑定与内核实例化一起进行。然后调用 viewModel 并返回一个 DesignTimeViewModel,以及我所有的硬编码数据。但是实际绑定到视图模型上的任何属性似乎永远不会被调用(虚拟转换器断点永远不会被命中)。
我真的看不出我做错了什么。任何方向的任何指针都将不胜感激,因为在这个阶段我只是感到困惑。谢谢 :)