对象引用未设置为对象存储库的实例

时间:2010-01-24 00:49:29

标签: c# wpf repository-pattern object-reference

我收到的XAMLParseException确实掩盖了另一个异常。这是堆栈跟踪的一部分:
Message=Object reference not set to an instance of an object.
Source=AssignmentOrganizer
StackTrace:
at AssignmentOrganizer.MainWindow..ctor() in C:\Users\Mohit\Documents\Visual Studio 2010 \Projects\AssignmentOrganizer\AssignmentOrganizer\MainWindow.xaml.cs:line 29

这是第29行:

lvwMain.ItemsSource = _assignmentRepo.ListAssignments();

其中lvwMain是ListView,而_assignmentsRepo是一个声明为的IAssignmentRepository:

IAssignmentRepository _assignmentRepo; 

这就是发生错误的地方。我正在使用存储库模式任何人都愿意猜测? 这是我的XAML:

<Window x:Class="AssignmentOrganizer.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
    Title="MainWindow" Height="518" Width="755">
<DockPanel>
    <Menu DockPanel.Dock="Top">

    </Menu>
    <ToolBar DockPanel.Dock="Top">

    </ToolBar>
    <StatusBar DockPanel.Dock="Bottom">

    </StatusBar>
    <Grid DockPanel.Dock="Left" Width="150">
        <Grid.RowDefinitions>
            <RowDefinition Height="259*" />
            <RowDefinition Height="259*" />
        </Grid.RowDefinitions>
    </Grid>
    <Grid DockPanel.Dock="Right" Width="150">

    </Grid>
    <Grid>
        <ListView x:Name="lvwMain">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Title"  Width="125" />
                    <GridViewColumn Header="Due"  Width="75" />
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</DockPanel>

4 个答案:

答案 0 :(得分:3)

在构造函数中,确保在执行任何其他构造函数逻辑之前放置InitializeComponent调用。

public MainWindow()
{
    // Do this first.
    InitializeComponent();

    // Now do the rest of the constructor.
    ...
    lvwMain.ItemsSource = _assignmentRepo.ListAssignments();
    ...
}

答案 1 :(得分:0)

_assignmentRepo看起来像null,因为您从未分配过它。这条线

IAssignmentRepository _assignmentRepo; 

声明一个变量_assignmentRepo,它是对实现IAssignmentRepository的对象的引用,但它实际上并不实例化这样的对象。在代码中的某个时刻,您需要一个像

这样的行
_assignmentRepo = new AssignmentRepository();

其中AssignmentRepository是实现IAssignmentRepository的类。当然,您可以在一行中声明和实例化:

IAssignmentRepository _assignmentRepo = new AssignmentRepository();

还有其他选项,例如

_assignmentRepo = RepositoryFactory.CreateRepository<AssignmentRepository>();

检查此问题的一种非常简单的方法是在违规行上设置断点,启动调试器并运行直到达到断点,然后将鼠标悬停在_assignmentRepo上。然后会出现一个小工具提示,您可以看到_assignmentRepo是否确实null

如果您省略了详细信息,并且实际上确实已经分配了_assignmentRepo,那么唯一的另一种可能性是lvmMain为空。你还没有给我们足够的信息来推断为什么会出现这种情况。

答案 2 :(得分:0)

我认为问题在于方法“ListAssignments()”。 此方法返回的集合中的某些项为null,并且当控件尝试绑定所有项时(期望all为NON null),它会抛出null对象的异常。

试试这个......

lvwMain.ItemsSource = _assignmentRepo.ListAssignments().where(item=>item!=null).ToList();

理想情况下,ListAssignments()应该忽略空对象。但你可以尝试这个来摆脱异常。

答案 3 :(得分:0)

你也会得到这个例外是lvwMain为null。