Xaml MVVM Light、Metro应用程序、继承ViewModelBase打破了设计模式

Xaml MVVM Light、Metro应用程序、继承ViewModelBase打破了设计模式,xaml,mvvm,microsoft-metro,windows-store-apps,mvvm-light,Xaml,Mvvm,Microsoft Metro,Windows Store Apps,Mvvm Light,我有一个奇怪的问题,我似乎找不到任何答案 我正在用Visual Studio 2012通过NuGet使用MVVM Light构建一个Metro商店应用程序 在设计和添加数据上下文xaml代码时,studio给了我一个红色的swiggly,错误是“对象引用未设置为对象的实例” 我最终将其缩小到viewmodel中的继承。我有一个基础viewmodel,我的所有viewmodel都继承自它,声明如下: public class BaseViewModel : ViewModelBase { } 显

我有一个奇怪的问题,我似乎找不到任何答案

我正在用Visual Studio 2012通过NuGet使用MVVM Light构建一个Metro商店应用程序

在设计和添加数据上下文xaml代码时,studio给了我一个红色的swiggly,错误是“对象引用未设置为对象的实例”

我最终将其缩小到viewmodel中的继承。我有一个基础viewmodel,我的所有viewmodel都继承自它,声明如下:

public class BaseViewModel : ViewModelBase
{
}
显然,我所有的viewmodels都是这样的:

public class MainViewModel : BaseViewModel
{
}
现在,在运行时,一切都很好(这让我很困惑),但设计模式中断了

但是,如果删除继承并让viewmodels直接继承ViewModelBase,则在设计模式下一切正常:

public class MainViewModel : ViewModelBase
{
}
我认为可能是代码中的某些内容导致了问题,所以我注释掉了所有内容,除了编译所需的内容,并且仍然收到相同的结果

任何人似乎都有这个问题,或者知道我这样做可能会做错什么?在使用MVVM处理Silverlight或WPF应用程序时,我通常使用相同的模式,在那里一切似乎都很好

顺便说一句,我的ViewModelLocator确实有一个返回MainViewModel类的MainVM属性

更新 在阅读了LBugnion和Will的评论之后,我正准备调试设计模式,这时我注意到goofily忘记了在BaseViewModel中注释我的代码。我确实发现里面有破译的代码。设计模式不喜欢以下行:

private CoreDispatcher UIDispatcher = Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher;
我用它来更新代码中的UI线程。我猜(哪个更有经验的人可能会插话)在设计模式中没有UI线程

通常我使用“IsInDesignMode”属性使我的viewmodels在设计中几乎不起作用,但这里显然忘记了这样做,所以我将上面的行改为

private CoreDispatcher UIDispatcher = IsInDesignModeStatic ? null : Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher;

我的错误总是发生,主要是因为类型中的代码是在设计器中执行的

是的,代码实际上可以在设计器中执行。设计器将把程序集加载到设计图面的AppDomain中,实例化您的类型,并对设计图面使用该实例

因此,如果您有以下情况:

public MyView : UIElement
{
    public MyView()
    {
        InitializeComponent();
        var database = GetDatabaseObject();
        database.OpenLikeWeAreInProduction();
        FillTheUiLol(database.GetAllKindsOfCrap());
    }
}
它很可能会中断,因为您的数据库不存在,您无法从app.config中找到连接字符串,等等

处理这种情况的方法是,每当您有可能在设计器中执行的代码时(例如在构造函数中、在属性更改事件处理程序中等),在执行保证在设计器中中断的代码之前,应该使用来确定您是否在设计器中


不幸的是,有时很难确定哪些代码被破坏。对于难以推断的故障,我唯一的解决方案是记录异常类型,启动Visual Studio的另一个实例,连接到第一个实例,然后配置调试以始终中断该异常类型。

我经常这样做,因此通常仅此一项不应中断设计模式。一定是在某个地方引发了异常,你试过调试设计模式代码吗?是的,没错,我通常对其他技术也会这样做,所以我想这可能是Metro的事情。显然我错了,我把调试搞砸了(如上面更新中所述),所以谢天谢地,现在一切正常。谢谢给你答案会打勾,因为你给出的方法是在这个场景中帮助调试的好方法。如果我还没有找到问题,我肯定我会用这个解决方案找到问题。谢谢
public MyView : UIElement
{
    public MyView()
    {
        InitializeComponent();
        var database = GetDatabaseObject();
        database.OpenLikeWeAreInProduction();
        FillTheUiLol(database.GetAllKindsOfCrap());
    }
}