首页 > 解决方案 > 为什么我的对象引用未设置为对象错误的实例?

问题描述

我正在尝试按照此页面上的示例将用户控件的数据上下文连接到要提供数据的视图模型。但是,当我这样做时,然后构建项目,我收到“对象引用未设置为对象的实例”错误。我不知道我在这里错过了什么。这是我的用户控件标题中的声明:

<UserControl
    x:Class="PharmacyWarehouse.View.ProgramSelectView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Platform"
    xmlns:convert="clr-namespace:PharmacyWarehouse.View.ValueConverters"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:local="clr-namespace:PharmacyWarehouse.View"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:vm="clr-namespace:PharmacyWarehouse.ViewModel"
    Width="500"
    Height="420"
    Background="Orange"
    mc:Ignorable="d">
    <UserControl.DataContext>
        <vm:ProgramSelectViewModel />
    </UserControl.DataContext>

它在抱怨<vm:ProgramSelectViewModel />.

我不认为这与其他关于空引用的问题和答案重复的原因是,其他视图和视图模型的编写方式类似,并且不会引发空引用。

ProgramSelectViewModel 里面有超过 500 行,所以我不会在这里复制它。我将提供构造函数:

[PreferredConstructor]
public ProgramSelectViewModel() : this(false) { }

//-----------------------------------------------------------------------------------------
// ProgramSelectViewModel
//-----------------------------------------------------------------------------------------
public ProgramSelectViewModel(bool unit_testing)
{
    Debug.WriteLine($"ProgramSelectViewModel: In constructor; this == {this.ToString()}");
    var connString = MainDataContext.Database.Connection.ConnectionString;
    var userRoles = new DatabaseRolesAndPermissions(connString);
    perms = userRoles.TablePermissions("PW.Program");

    SaveProgramSelectCommand = new RelayCommand(ExecuteSaveProgramSelectCommand, CanSaveProgramSelectCommand);
    CancelProgramSelectCommand = new RelayCommand(ExecuteCancelProgramSelectCommand);

    Messenger.Default.Register<ProceedWithProgramSelectUpdateMessage>(this, UpdateProgramSelect);
    Messenger.Default.Register<OpenProgramSelectMessage>(this, ReadMessageData);
    Messenger.Default.Register<ParentObjectMessage>(this, ReceiveParentObjectMessage);
}

标签: wpfdata-bindingmvvm-light

解决方案


这个问题很可能是在做你认为它正在做的事情,在 xaml 中实例化一个视图模型(而不是像第二个示例那样隐藏代码)。异常很可能来自视图模型上引发异常的某些东西。

在调试模式下运行代码并查看断点命中的位置以确定如何解决。


推荐阅读