4

好的,我正在为此烦恼,所以任何帮助都将不胜感激!

我正在使用 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,以及我所有的硬编码数据。但是实际绑定到视图模型上的任何属性似乎永远不会被调用(虚拟转换器断点永远不会被命中)。

我真的看不出我做错了什么。任何方向的任何指针都将不胜感激,因为在这个阶段我只是感到困惑。谢谢 :)

4

2 回答 2

1

这里有几件事可以尝试:

  1. 在调试设计器时,请检查是否有任何警告/错误。
  2. 尝试使用最新版本的 Snoop来窥探您的设计器,它允许您附加到 Visual Studio。
  3. 尝试调试绑定。也许会出现一些有趣的事情。

并且不要忘记检查 DataContexts :)。

希望至少能有所帮助。

干杯

于 2010-02-18T17:30:27.530 回答
0

也许 Visual Studio 2010 和 Expression Blend 4 的新设计时功能是您的选择。

WPF 应用程序框架 (WAF)的BookLibrary示例应用程序显示了它的工作原理。请下载 .NET4 版本。

于 2010-07-10T09:24:48.793 回答