0

我确定这是一个 MVVM Light 新手错误,但我需要问一下。我正在使用 MVVM Light 框架和 Ninject for DI 创建一个 WPF4 应用程序。在 ViewModelLocator 构造函数中,我传入 ViewModelBase.IsInDesignModeStatic 值,因此我知道使用 DesignTime 数据或 RunTime 数据创建 DI。我认为当您在设计器( VS2010 或 Blend )中打开 MainWindow.xml 时,该属性将为 True 并且如果我设置了断点,构造函数将执行并在调试中中断。该应用程序运行良好并在正确运行时进行调试,但我从未获得设计时数据,因为该属性始终为假。在设计器中打开时,构造函数似乎也没有执行。我多次观看 Laurent 的视频,我知道这确实有效。有人可以告诉我他们认为我一定做错了什么。

奥格布拉特

4

1 回答 1

0

我迟到了,但在解决这类问题时试试这个。

您需要一个简单的属性来测试:在 ViewModel 中创建一个“Foo”属性(字符串)并将其绑定到 XAML(例如使用 TextBlock)。

在视图模型中

  1. 在“Get”中,返回一个硬编码字符串(例如:“Step 1”。这将验证“绑定”是否有效。
  2. 去掉“Get”硬代码,在构造函数的第一行放一个this.Foo =“Step 2”,这样会验证构造函数是否被调用
  3. 在调用被“回调”的地方放置第三组,这将检查 GetData 是否正在返回
  4. 在 if (error != null) 的 "else" 中,放第四组,以此类推...

示例:这是我的 MainViewModel 构造函数。

    public MainViewModel(IDataService dataService)
    {
        this.Foo = "Step 2";

        _dataService = dataService;
        _dataService.GetData(
            (item, error) =>
            {
                this.Foo = "Step 3";

                if (error != null)
                {
                    // Report error here
                    return;
                }
                else
                {
                    this.Foo = "Step 4";

                }


            });
    }

我的最后一个错误是我已经将从 GetData 返回的数据分配到“if (error != null){...}”中!所以它从来没有被调用过。

从那时起,我像这样重写构造函数:

    public MainViewModel(IDataService dataService)
    {

        _dataService = dataService;
        _dataService.GetData(
            (item, error) =>
            {
                if (error == null)
                {
                    // Normal code here
                    return;
                }
                else
                {
                    // Report error here
                    return;
                }                    
            });
    }
于 2012-09-27T17:59:18.180 回答