2010-01-24 47 views
1

我得到一个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> 

回答

3

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

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

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

貌似_assignmentReponull因为你永远不分配给它。行

IAssignmentRepository _assignmentRepo; 

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

_assignmentRepo = new AssignmentRepository(); 

线,其中AssignmentRepository是实现IAssignmentRepository类。当然,你可以声明,并在同一行实例:

IAssignmentRepository _assignmentRepo = new AssignmentRepository(); 

还有其他选项,如

_assignmentRepo = RepositoryFactory.CreateRepository<AssignmentRepository>(); 

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

如果您正在省略细节并且实际上已明确指定_assignmentRepo,那么唯一的其他可能是lvmMain为空。你没有给我们足够的信息来推断为什么会是这种情况。

+0

我试着将它分配给AssignmentRepository。但是_assignmentRepo并不是空的,因为我从断点中学到了东西。 – 2010-01-24 01:27:06

+0

如果我删除了设置listview项目源的代码行,代码运行得很好。 – 2010-01-24 03:17:45

+0

@Mohit Deshpande:如果你确定你已经分配了'_assignmentRepo',那么你还需要检查'lvmMain'。 – jason 2010-01-24 20:42:46

0

我认为问题出在方法“ListAssignments()”。 此方法返回的集合中的某些项目为null,并且当控件试图绑定所有项目(期望所有项目都为NON null)时,它将引发空对象的异常。

试试这个...

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

理想,ListAssignments()应该忽略空的对象。但是你可以试着去摆脱这个例外。

+0

堆栈跟踪不会在“ListAssignments”内引发异常。 – jason 2010-01-24 12:53:47

+0

它不会。对于返回一个包含null项的集合的方法来说,它非常好。所以在ListAssignments()中没有问题。 将该集合分配给ItemSource时引发异常,因为它将迭代每个项目(期望所有项目都为非null)并为每个项目创建ListItem。 – 2010-01-24 14:17:42

+0

然后说这个问题与'ListAssignments'有关就是误导。 – jason 2010-01-24 23:44:48

0

你也会得到这个异常是lvwMain为null。

相关问题